题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4826
题意:中文题,不解释
题解:dp搞,第一列只能从上往下走,所以先算出第一列的dp数组,然后开两个dp数组来算剩下列的从上往下和从下往上dp的值,最后取最大就是走到该单元格的最大值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #define max(a,b) ((a)>(b)?(a):(b)) 3 int a[101][101],dp1[101],dp2[101],t,n,m,ic=1; 4 int fuck(){ 5 for(int i=2;i<=m;i++)a[i][1]+=a[i-1][1];//第一列的dp数组 6 for(int i=2;i<=n;i++){//剩下的列 7 dp1[0]=dp2[0]=dp1[m+1]=dp2[m+1]=-99999999; 8 //分别从下往上算和从上往下算,然后求最大 9 for(int j=m;j>=1;j--) 10 dp1[j]=max(dp1[j+1],a[j][i-1])+a[j][i]; 11 for(int j=1;j<=m;j++) 12 dp2[j]=max(dp2[j-1],a[j][i-1])+a[j][i]; 13 for(int j=1;j<=m;j++) 14 a[j][i]=max(dp1[j],dp2[j]); 15 } 16 return a[1][n]; 17 } 18 int main(){ 19 scanf("%d",&t); 20 while(t--){ 21 scanf("%d%d",&m,&n); 22 for(int i=1;i<=m;i++) 23 for(int j=1;j<=n;j++)scanf("%d",&a[i][j]); 24 printf("Case #%d: %d ",ic++,fuck()); 25 } 26 }