洛谷P1004 方格取数 dp

这一题相当于两个人从左上角走到右上角

dp[i][j][k][l]表示第一个人走到(i,j)第二个人走到(k,l)时取到数总和的最大值

dp[i][j][k][l]=max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])+a[i][j]+a[k][l]

如果i==k,j==l时应该再减去a[i][j](每个位置的数只能取一次)

#include<iostream>
using namespace std;
int dp[11][11][11][11];//dp[i][j][k][l]表示第一个人走到(i,j)第二个人走到(j,k)时取走数的最大值
int n,b,c,d,a[11][11];
int maxx(int a,int b,int c,int d)
{
    a=max(a,b);a=max(a,c);a=max(a,d);
    return a;
}
void solve()
{
    int i,j,k,l;
    cin>>n;
    while(1)
    {
        cin>>b>>c>>d;
        if(b==0&&c==0&&d==0)break;
        a[b][c]=d;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            for(k=1;k<=n;k++)
                for(l=1;l<=n;l++)
                {
                    dp[i][j][k][l]=maxx(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],
                    dp[i][j-1][k][l-1])+a[i][j]+a[k][l];
                    if(i==k&&j==l)dp[i][j][k][l]-=a[i][j];
                }
    cout<<dp[n][n][n][n]<<endl;
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/10022613.html