方格取数的题解

本蒟蒻第一次写博客,发一些水题。大佬勿喷。欢迎大佬们指出不足。

思路:这道题是一道裸的动规,不能分两次走,要一次拿完才可以拿到最大,所以一种状态可能有四组状态转移过来(上上,上左,左上,左左),要选取其中最大的一种情况,当两人同时走到一点的时候还要判重。有四种情况所以要开一个四维数组和一个四重循环。然后是参考代码

#include<bits/stdc++.h>
using namespace std;
int dp[15][15][15][15],a[15][15];
int x,y,z,n;
int main()
{
    scanf("%d%d%d%d",&n,&x,&y,&z);
    while(x!=0&&y!=0&&z!=0)//不等于零就一直输入 
    {
        a[x][y]=z;//坐标为x,y的点数是z 
        scanf("%d%d%d",&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 f=1;f<=n;f++)
                {
                    dp[i][j][k][f]=max(max(dp[i-1][j][k-1][f],dp[i-1][j][k][f-1]),max(dp[i][j-1][k][f-1],dp[i][j-1][k-1][f]))+a[i][j]+a[k][f];//动态转移方程,判断四种情况哪种最大 
                    if(i==k&&j==f) dp[i][j][k][f]-=a[i][j];//判重 
                }
            }
        }
    }
    printf("%d",dp[n][n][n][n]);//输出
    return 0//完美解决 
}

题解结束,希望这道题对你有所帮助。有不懂的地方欢迎交流,也欢迎大佬们指出错误。

猜你喜欢

转载自www.cnblogs.com/jiuduSHENBENG/p/9489232.html