您的位置:首页 > 其它

Codeforce 429B(递推)

2016-04-18 22:54 218 查看
链接:点击打开链接

题意:有两个人一个从左上角走到右下角一个,一个从左下角走到右上角,两个人只能相遇一回并且相遇的点的价值都不取,问两个人价值和最大是多少

代码:
#include <math.h>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
const long long INF=0x3f3f3f3f;
long long a[1005][1005],dp[1005][1005][5];
int main(){
long long i,j,k,n,m,ans,tmp;
while(scanf("%I64d%I64d",&n,&m)!=EOF){
ans=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(i=n;i>=1;i--)                       //向四个角递推
for(j=m;j>=1;j--)
dp[i][j][0]=max(dp[i+1][j][0],dp[i][j+1][0])+a[i][j];
for(i=n;i>=1;i--)
for(j=1;j<=m;j++)
dp[i][j][1]=max(dp[i][j-1][1],dp[i+1][j][1])+a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dp[i][j][2]=max(dp[i-1][j][2],dp[i][j-1][2])+a[i][j];
for(i=1;i<=n;i++)
for(j=m;j>=1;j--)
dp[i][j][3]=max(dp[i-1][j][3],dp[i][j+1][3])+a[i][j];
for(i=2;i<=n-1;i++)
for(j=2;j<=m-1;j++){                    //不能再边界上相遇,否则不止会相遇一次
tmp=dp[i+1][j][0]+dp[i][j-1][1]+dp[i-1][j][2]+dp[i][j+1][3];
ans=max(ans,tmp);
tmp=dp[i][j+1][0]+dp[i+1][j][1]+dp[i][j-1][2]+dp[i-1][j][3];
ans=max(ans,tmp);
}
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: