codevs 1258(区间dp)
2017-08-20 19:46
204 查看
传送门
认真练一下NOIP水平的题目,省选/NOI的题目也要做但是不能好高骛远。
题解:
记录一个区间外其它路灯的功率power[i][j],设l[i][j],r[i][j]分别表示由上一个区间走到当前区间左/右的代价。
可得转移方程(代码之前):
认真练一下NOIP水平的题目,省选/NOI的题目也要做但是不能好高骛远。
题解:
记录一个区间外其它路灯的功率power[i][j],设l[i][j],r[i][j]分别表示由上一个区间走到当前区间左/右的代价。
可得转移方程(代码之前):
/* l[i][j]=min(l[i+1][j]+power[i+1][j]*(d[i+1]-d[i]),r[i+1][j]+power[i+1][j]*(d[j]-d[i]))); r[i][j]=min(r[i][j-1]+power[i][j-1]*(d[j]-d[j-1]),l[i][j-1]+power[i][j-1]*(d[j]-d[i]))); */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=1002,INF=0x3f3f3f3f; int n,pos,d[maxn],sum[maxn]={0}; int power[maxn][maxn],l[maxn][maxn],r[maxn][maxn]; //区间外的代价,由上一个区间走到左/右的代价 inline int read() { int x=0;char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x; } int main() { n=read(),pos=read(); for (int i=1;i<=n;++i) d[i]=read(),sum[i]=sum[i-1]+read(); for (int i=1;i<=n;++i) for (int j=i;j<=n;++j) power[i][j]=sum -sum[j]+sum[i-1]; memset(l,INF,sizeof(l)),memset(r,INF,sizeof(r)); l[pos][pos]=r[pos][pos]=0; for (int i=n-1;i>0;--i) for (int j=i+1;j<=n;++j) { l[i][j]=min(l[i][j],min(l[i+1][j]+power[i+1][j]*(d[i+1]-d[i]),r[i+1][j]+power[i+1][j]*(d[j]-d[i]))); r[i][j]=min(r[i][j],min(r[i][j-1]+power[i][j-1]*(d[j]-d[j-1]),l[i][j-1]+power[i][j-1]*(d[j]-d[i]))); } printf("%d\n",min(l[1] ,r[1] )); return 0; }
相关文章推荐
- codevs1258 关路灯(☆区间dp)
- CodeVS 1166 矩阵取数游戏(区间DP+高精度)
- Codevs1154 能量项链 ——2006年NOIP全国联赛提高组 区间dp
- codevs 1048能量项链(区间DP)
- 区间DP——1048 石子归并 codevs
- codevs1166 矩阵取数游戏(区间DP)
- codevs1166 矩阵取数游戏(区间DP)
- codevs1154能量项链(环形dp,区间dp)
- 【CODEVS 1154】能量项链(区间DP)
- 【poj 1141】Brackets Sequence 经典的区间dp
- HDU 4283 You are the one(区间DP)
- Light OJ 1422 - Halloween Costumes (区间DP)
- LightOJ-1044-区间dp
- POJ 1991 Turning in Homework ★(区间DP)
- HDU 4283 You Are the One (区间dp)
- 【区间DP】BZOJ1260(CQOI2007)[涂色paint]题解
- bzoj 1261 区间DP
- POJ 1141 区间DP
- 算法提高 矩阵乘法 (区间dp)
- LightOJ1422 Halloween Costumes(区间DP)