关键词:
题目传送门https://www.luogu.org/problem/show?pid=1220
我们假设 dpij0 为目前最优值是在 i 位置,dpij1 为目前最优值是在 j 位置
则 i 到 j 表示已经关掉的灯的区间,因为我们要求最小的损耗,所以必然是从当前区间走向区间两端
再利用前缀和来算从前一个位置走向当前位置所需要的时间,再乘上没关掉电灯的功率即可
for(i = c to 1)for(j = i+1 to n)
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(a[i+1]-a[i])*(b[n]-(b[j]-b[i])));//分4情况,耗能计算,时间乘以功率
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(a[j]-a[i])*(b[n]-(b[j]-b[i])));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(a[j]-a[j-1])*(b[n]-(b[j-1]-b[i-1])));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(a[j]-a[i])*(b[n]-(b[j-1]-b[i-1])));
至于这个方程怎么推的,请看解释(只推了第一个方程,其他类比)如下,
时间t=a[i+1]-a[i],距离s=b[n]-(b[j]-b[i])(不懂的可以留言哦!!!)
代码
//Gang #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #define FOR(x,y,z) for(int x=y;x<=z;x++) #define REP(x,y,z) for(int x=y;x>=z;x--) #define INF 0x3f3f3f3f #define ll long long using namespace std; int dp[55][55][3];//dp[i][j][0]表示关掉i to j区间灯后得到最优值在i的位置。//dp[i][j][1]则表示结束后在j的位置 int a[55],b[55],c,n;//a[i]表示每个路灯的位置,b[i]表示每个路灯的功率 int main() { scanf("%d %d",&n,&c); FOR(i,1,n) { scanf("%d %d",&a[i],&b[i]); b[i]+=b[i-1]; } FOR(i,1,n) FOR(j,1,n) dp[i][j][0]=dp[i][j][1]=INF;//求最小值初值符得很大 dp[c][c][0]=dp[c][c][1]=0; REP(i,c,1) { FOR(j,i+1,n) { dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(a[i+1]-a[i])*(b[n]-(b[j]-b[i])));//分4种情况,耗能计算,时间乘以功率 dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(a[j]-a[i])*(b[n]-(b[j]-b[i]))); dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(a[j]-a[j-1])*(b[n]-(b[j-1]-b[i-1]))); dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(a[j]-a[i])*(b[n]-(b[j-1]-b[i-1]))); } } printf("%d",min(dp[1][n][0],dp[1][n][1])); return 0; }
洛谷[p1220]关路灯
...是一道区间DP,很容易设计出状态,dp[i][j]代表关掉i到j的路灯所耗的电量,但是对于新到一个路灯来说,可以是原来直接来的,也可以是掉头来的,于是还需要添加一维0代表在区间的左端,1代表在区间的右端。从最开始所在的... 查看详情
关路灯,洛谷dp
题目传送门https://www.luogu.org/problem/show?pid=1220我们假设dpij0为目前最优值是在i位置,dpij1为目前最优值是在j位置则i到j表示已经关掉的灯的区间,因为我们要求最小的损耗,所以必然是从当前区间走向区间两端再利用前缀和来... 查看详情
洛谷p1220关路灯[区间dp]
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情
洛谷p1220关路灯
P1220关路灯题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了... 查看详情
洛谷1220关路灯
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情
洛谷1220关路灯题解
...地址:传送门题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。... 查看详情
洛谷——p1220关路灯
...roblem/show?pid=1220题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。... 查看详情
codevs1258关路灯(☆区间dp)
1258关路灯 时间限制:1s 空间限制:128000KB 题目等级:大师Master 题目描述 Description多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧... 查看详情
[luogup1220]关路灯(dp)
传送门 如果去关某一个灯,那么途中经过的灯都能关闭,那么就是连续一段区间,区间DP。f[i][j][0]表示关完i,j这个区间且在i这个位置f[i][j][1]表示关完i,j这个区间且在j这个位置 代码#include<cstdio>#include<cstring>#inclu... 查看详情
luogup1220关路灯(代码片段)
...( tbibi,)233~状态一道区间(DP),我们用dp[i][j]表示将第(i)盏路灯到第(j)路灯之间的路灯全部关上的最小能耗,但这样我们很难转移,根本无从下手——不知道老张的位置。既然我们缺少位置信息,那再加上一维不就好了么。于是我... 查看详情
p1220关路灯区间dp
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情
「luogup1220」关路灯(区间dp(代码片段)
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情
p1220关路灯
【P1220】关路灯-洛谷https://www.luogu.org/problem/show?pid=1220P1220关路灯题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工... 查看详情
区间dp②
区间dp的第②篇,稍微有点难度关路灯题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏... 查看详情
典型题
dp关路灯区间dp相似基因普通dp 查看详情
关路灯(代码片段)
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情
p1220关路灯
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情
luogu1220关路灯
题目描述某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节... 查看详情