CodeForces213C.Relay Race

来源:互联网 发布:设置网络共享打印机 编辑:程序博客网 时间:2024/06/05 03:47

题目意思:
一个人从(1,1)到(n,n),另一个人从(n,n)到(1,1)所经过的方格的和,每个方格最多只被计算一次,问最多和能有多少
思路:
不难看出,可转化为从(1,1)到(n,n)走两次所经过的方格的和最多能有多少
经分析可知,每个方格的横坐标纵坐标之和就是所经过的时间,
dp[t][i][j]表示走了时间t,两个人的横纵坐标分别为i,j;那么他们的纵坐标便为t-i+1,t-j+1;
同时,如果两个人走到一个点,他们所经过的时间必定相同
所以转移方程为dp[t][i][j]=max1(dp[t-1][i][j],dp[t-1][i-1][j],dp[t-1][i][j-1],dp[t-1][i-1][j-1])+(i==j?a[i][t+1-i]:(a[i][t+1-i]+a[j][t+1-j])));

#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define mem(a, b) memset(a, b, sizeof(a))typedef long long ll;const int maxn=301;int dp[2*maxn][maxn][maxn];int a[maxn][maxn];int max1(int x1,int x2,int x3,int x4){    return max(max(x1,x2),max(x3,x4));}int main(){    int n;    while(scanf("%d",&n)!=EOF){        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                scanf("%d",&a[i][j]);        memset(dp,inf,sizeof(dp));        dp[0][1][1]=0;        for(int t=1;t<2*n;t++)            for(int i=1;i<=n&&i<=t;i++)                for(int j=1;j<=n&&j<=t;j++){                    dp[t][i][j]=(max1(dp[t-1][i][j],dp[t-1][i-1][j],dp[t-1][i][j-1],                                dp[t-1][i-1][j-1])+(i==j?a[i][t+1-i]:(a[i][t+1-i]+a[j][t+1-j])));                }        printf("%d\n",dp[n*2-1][n][n]);    }    return 0;}
0 0
原创粉丝点击