Hrbust 1214 方格取数 (双线程dp)

来源:互联网 发布:mac快捷键大全 编辑:程序博客网 时间:2024/06/06 02:24

题目链接:
Hrbust 1214

题解:
双线程dp

dp[k][i][j],其中k表示走了k步,i表示第一个人在i 列,j表示第二个人在j 列,那么这时第一个人在ki+1行,第二个人在kj+1行。
所以
dp[k][i][j]=dp[k1][i1][j]+mp[ki+1][i]+mp[kj+1][j]
dp[k][i][j]=dp[k1][i][j1]+mp[ki+1][i]+mp[kj+1][j]
dp[k][i][j]=dp[k1][i1][j1]+mp[ki+1][i]+mp[kj+1][j]

代码:

#include <bits/stdc++.h>using namespace std;int dp[23][23][23];int mp[23][23];int n,ans;int main(){      while(~scanf("%d",&n))    {        memset(mp,0,sizeof(mp));        memset(dp,0,sizeof(dp));        int a,b,c;        while(~scanf("%d%d%d",&a,&b,&c),a&&b&&c)        {            mp[a][b]=c;        }        for(int k=1;k<2*n;k++)        {            for(int j=1;j<=k;j++)            {                dp[k][0][k-j+1]=mp[j][k-j+1];            }        }             ans=0;        int tmp1,tmp2,tmp3,tmp4;        for(int k=2;k< 2*n;k++)        {            for(int i=1;i<=k && i<=n;i++)            {                for(int j=i+1;j<=k && j<=n;j++)                {                    tmp1 = dp[k-1][i][j-1] + mp[k-i+1][i] + mp[k-j+1][j];                    tmp2 = dp[k-1][i-1][j] + mp[k-i+1][i] + mp[k-j+1][j];                    tmp1 = max(tmp1,tmp2);                    tmp3 = dp[k-1][i][j] + mp[k-i+1][i] + mp[k-j+1][j];                      tmp1 = max(tmp1,tmp3);                    tmp4 = dp[k-1][i-1][j-1] + mp[k-i+1][i] + mp[k-j+1][j];                    tmp1=max(tmp1,tmp4);                    dp[k][i][j]=tmp1;                    if(tmp1>ans)                    {                        ans=tmp1;                    }                               }            }        }             if(n==1)        {            cout<<mp[1][1]<<endl;        }        else cout<<ans<<endl;    }    return 0;}