标签:print size sub scan bit bottom 所在地 yifenfei 负数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23957 Accepted Submission(s): 8296
题意:从左上角走到右下角,每个位置都有一个权值,要使得走到右下角时权值和最大,输出最大值
题解:用动态规划做,dp数组里面存每个位置当前所能达到的最大值,dp数组一开始要初始为-100,不能是0,因为权值里面有负数,0不够小
dp[0][1]和dp[1][0]要初始化为0,一开始的位置比较特殊
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[25][1005]; 4 int dp[25][1005]; 5 int main() 6 { 7 int c; 8 while(~scanf("%d",&c)) 9 { 10 while(c--) 11 { 12 int n,m; 13 scanf("%d %d",&n,&m); 14 memset(dp,-100,sizeof(dp)); 15 dp[0][1]=dp[1][0]=0; 16 for(int i=1; i<=n; i++) 17 { 18 for(int j=1; j<=m; j++) 19 { 20 scanf("%d",&a[i][j]); 21 } 22 } 23 for(int i=1; i<=n; i++) 24 { 25 for(int j=1; j<=m; j++) 26 { 27 28 int t,maxx=-10001; 29 for(int t=2; t<=j; t++) 30 { 31 if(j%t==0) 32 { 33 maxx=max(maxx,max(dp[i-1][j],dp[i][j/t])); 34 } 35 36 } 37 maxx=max(maxx,max(dp[i-1][j],dp[i][j-1])); 38 39 dp[i][j]=a[i][j]+maxx; 40 } 41 } 42 printf("%d\n",dp[n][m]); 43 } 44 } 45 return 0; 46 }
标签:print size sub scan bit bottom 所在地 yifenfei 负数
原文地址:https://www.cnblogs.com/fqfzs/p/9826740.html