Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 8488 Accepted
Submission(s): 2991
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define minn -1000 5 int n, m; 6 int dp[25][1005]; 7 int K[25][1005]; 8 int max(int a,int b) 9 { 10 return a>b?a:b; 11 } 12 void solve() 13 { 14 int i, j, k, maxx; 15 for(i=0; i<=n; i++) 16 dp[i][0] = minn; 17 for(j=0; j<=m; j++) 18 dp[0][j] = minn; 19 for(i=1; i<=n; i++) 20 { 21 for(j=1; j<=m; j++) 22 { 23 maxx = minn; 24 for(k=1; k<j; k++) 25 if(j%k==0 || j-k==1) 26 maxx = max(maxx,dp[i][k]); 27 if(i==1 && j==1) 28 dp[i][j] = K[i][j]; 29 else 30 dp[i][j] = K[i][j]+max(dp[i-1][j],maxx); 31 } 32 } 33 } 34 35 int main() 36 { 37 int C, i, j; 38 scanf("%d",&C); 39 while(C--) 40 { 41 scanf("%d%d",&n,&m); 42 for(i=1; i<=n; i++) 43 for(j=1; j<=m; j++) 44 scanf("%d",&K[i][j]); 45 solve(); 46 printf("%d\n",dp[n][m]); 47 } 48 return 0; 49 }
原文:http://www.cnblogs.com/yazhou/p/3680340.html