题目:http://acm.hdu.edu.cn/showproblem.php?pid=2571
//#include <stdafx.h> #include <iostream> using namespace std ; int dp[1000][1000]={0}; int main(int argc, const char *argv[]) { //freopen("input.txt","r",stdin); int n,m; int T; cin>>T; while(T--) { cin>>n>>m; for (int i = 1; i <=n; ++i) { for (int j = 1; j <= m; ++j) { cin>>dp[i][j]; } } //转移方程 //dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i][k])(k<=j/2&&j%k==0) for(int j=1;j<=m;j++) //第一行初始化 { int max = dp[1][j-1]; for(int k=1;k<=j-1;k++) { if(j%k==0) { max = dp[1][k]>max?dp[1][k]:max; } } dp[1][j]+=max; //printf("第1行第%d列最大值%d ",j,dp[1][j]); } int res = dp[1][1]; for(int i=2;i<=n;i++) { for(int j=1;j<=m;j++) { int max = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1]; for(int k=1;k<=j-1;k++) { if(j%k==0) { max = dp[i][k]>max?dp[i][k]:max; } } dp[i][j]+=max; //printf("第%d行第%d列最大值%d ",i,j,dp[i][j]); if(res<dp[i][j]) { res = dp[i][j]; } } } cout<<dp[n][m]<<endl; } return 0; }