洛谷1004

来源:互联网 发布:淘宝公益宝贝产品好吗 编辑:程序博客网 时间:2024/06/10 02:12

看到这个范围
就知道非dp 莫属了
看成两个人一起走
**开一个四维数组f[i][j][k][l]代表第一个人走到ij第二个人走到kl时的最大值,
答案在f[n][n][n][n]的位置**
思路
1
找出上一个时间点的最大值
2
加上现在的位置的值
3
如果两个人的位置不同再加上另一个人的位置的值

#include<iostream>#include<algorithm>using namespace std;int n,x,y,z,a[55][55],f[55][55][55][55];int main(){    cin>>n>>x>>y>>z;    while(x>0&&y>0&&z>0)    {        a[x][y]=z;        cin>>x>>y>>z;    }    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            for(int k=1;k<=n;k++)            {                for(int l=1;l<=n;l++)                {                    int opt1=max(f[i-1][j][k-1][l],f[i][j-1][k][l-1]);                    int opt2=max(f[i-1][j][k][l-1],f[i][j-1][k-1][l]);                    f[i][j][k][l]=max(opt1,opt2)+a[i][j];                    if(i!=k && j!=l) f[i][j][k][l]+=a[k][l];                }            }        }    }    cout<<f[n][n][n][n];    return 0;}
原创粉丝点击