hdu_4826_Labyrinth_2014百度之星(dp)

时间:2023-03-09 07:11:49
hdu_4826_Labyrinth_2014百度之星(dp)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4826

题意:中文题,不解释

题解:dp搞,第一列只能从上往下走,所以先算出第一列的dp数组,然后开两个dp数组来算剩下列的从上往下和从下往上dp的值,最后取最大就是走到该单元格的最大值

 #include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
int a[][],dp1[],dp2[],t,n,m,ic=;
int fuck(){
for(int i=;i<=m;i++)a[i][]+=a[i-][];//第一列的dp数组
for(int i=;i<=n;i++){//剩下的列
dp1[]=dp2[]=dp1[m+]=dp2[m+]=-;
//分别从下往上算和从上往下算,然后求最大
for(int j=m;j>=;j--)
dp1[j]=max(dp1[j+],a[j][i-])+a[j][i];
for(int j=;j<=m;j++)
dp2[j]=max(dp2[j-],a[j][i-])+a[j][i];
for(int j=;j<=m;j++)
a[j][i]=max(dp1[j],dp2[j]);
}
return a[][n];
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&n);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)scanf("%d",&a[i][j]);
printf("Case #%d:\n%d\n",ic++,fuck());
}
}