NOIP2009 道路游戏
2017-10-19 20:57
204 查看
解题报告
思路:
这道题的解法就是dp,因为每一秒的最优解都可以通过任意点走了k步到达//i:秒 v:已捡到的钱 last:从哪里产出 dp[i]=Max(dp[i],dp[i-k]+v-pay[last]);
这其中当前在哪一个点上(j)决定了k和last的关系,然后
last--; if(last==0)last=n; v+=gold[last][i-k];
中的v要累加,这里k发挥了作用,因为如果不累加可以看到在
dp[i]=Max(dp[i],dp[i-k]+v-pay[last]);
中其实pay(也就是产出地)始终只有一个,而dp直接到了dp[i-k],所以dp
k+1~i的路上没有加钱。
后面基本没有理解难度了
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define maxn -99999999 #define Max(a,b) (a)>(b)?(a):(b) int n,m,p; int gold[1005][1005],pay[1005]; int dp[1005]; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+ch-'0'; ch=getchar(); } return x*f; } int main() { int i,j,k; n=read();m=read();p=read(); for(i=1;i<=n;i++) for(j=1;j<=m;j++)scanf("%d",&gold[i][j]); for(i=1;i<=n;i++)scanf("%d",&pay[i]); for(i=1;i<=m;i++)dp[i]=maxn; for(i=1;i<=m;i++){ for(j=1;j<=n;j++) { int last=j-1; if(last==0)last=n; int v=gold[last][i]; for(k=1;k<=p;k++) { if(i-k<0)break; dp[i]=Max(dp[i],dp[i-k]+v-pay[last]); last--; if(last==0)last=n; v+=gold[last][i-k]; } } } printf("%d\n",dp[m]); return 0; }
完
相关文章推荐
- 洛谷 P1070 [NOIP2009 T4] 道路游戏
- NOIP2009 普及组 道路游戏
- NOIP2009——道路游戏(game)
- NOIP2009普及组——道路游戏(game)
- noip2009 道路游戏 (单调队列优化动态规划)
- noip2009-4 道路游戏
- noip 2009 道路游戏
- noip2009普及组道路游戏解题报告
- NOIP2009pj道路游戏[环形DP 转移优化 二维信息]
- 【NOIP2009】洛谷1070 道路游戏
- 【NOIP2009PJ】道路游戏
- 【noip2009】道路游戏
- 洛谷 P1070 Vijos 1815 [NOIP 2009]道路游戏
- [NOIP2009]普及组T4 道路游戏
- 1131. 【NOIP2009PJ】道路游戏
- [普及] NOIP 2009 道路游戏
- NOIP2009普及组 道路游戏
- NOIP2009(4)道路游戏
- noip2009道路游戏【高诗豪】
- [NOIP2009][vijos1809]三国游戏(贪心)