HDOJ 2571 命运 解题报告
动态规划,简单题。
每次走,从(x,y)到(x+1,y)或(x,y+1)或(x,y*k)(k>1 && y*k<=m)。每次就有三种选择,而我们要选择令和最大的路径。
动态规划的原则,结果最优,则子结果也是最优的,对于每个位置(x,y),我们求最大值,即取(x-1,y),(x,y-1),(x,y/k)三个位置的最大值。(x-1,y),(x,y-1)很容易处理,对于(x,y/k),我们可以在处理每个位置后,对他的y整数倍位置进行赋值,比他大则更新。额。。。看代码更清楚。
#include <iostream> using namespace std; int dp[22][1002]; int maxOfThree(int a,int b,int c) { return a>b?(a>c?a:c):(b>c?b:c); } int main() { int cas,i,j,k,m,n,t; cin>>cas; while(cas--) { cin>>n>>m; for(i=0;i<=n;i++) for(j=0;j<=m;j++) dp[i][j]=-110; dp[1][1]=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>t; dp[i][j]=t+maxOfThree(dp[i][j],dp[i-1][j],dp[i][j-1]); for(k=2;k*j<=m;k++) if(dp[i][k*j]<dp[i][j]) dp[i][k*j]=dp[i][j]; } cout<<dp[n][m]<<endl; } }
之前初始化时直接memset,都赋值为0,所以一直wrong。后来索性两循环,全部赋值-110。
网上搜到的代码基本是建了两个二维数组,一个存输入,一个存和,其实一个就够了。
这题告诉我的另一件事是,0是个奇怪的东西,数无限,却因0而分正负。主观意识中,0和正数的感觉总是比负数好。零下几度的天气会很冷,负的增长率是损失,这种正数比负数好的感觉就像刻在脑子里一样,挥之不去。对抽象的东西因为主观意识产生偏见,就是对真理的不尊重啊。以此为戒