http://acm.hdu.edu.cn/showproblem.php?pid=2571
就是很普通的根据题意递推了。
不过题意有个坑的地方,有负值。所以初始化必须为-inf。被坑了好长时间。
另外 不知道为什么 define 负数就错的 ,非得 改成 const int inf 。以后就这样用吧。
和以前比赛做的那个走格子几乎是同样的。
View Code
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #define maxn const int inf=~0U>>1;//利用define 错了 。。。以后用这个 using namespace std; int dp[25][2000]; int value[25][2000]; int main() { int test; int n,m; cin>>test; while(test--) { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cin>>value[i][j]; } for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) dp[i][j]=-inf;//初始化为0错的,以后注意有负值得情况,必须用-inf,因为是自动得到的 dp[1][1]=value[1][1]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i+1][j]=max(dp[i+1][j],dp[i][j]+value[i+1][j]); dp[i][j+1]=max(dp[i][j+1],dp[i][j]+value[i][j+1]); for(int k=2;k*j<=m;k++) dp[i][k*j]=max(dp[i][k*j],dp[i][j]+value[i][k*j]); } } printf("%d\n",dp[n][m]); } return 0; }