算法训练方格取数

#include<bits/stdc++.h>
using namespace std;
// 走两次是不行的,因为这就是贪心了。。
// 需要多线程dp,就是想象有2个人同时走,他们可以走到一起,但是必须只加一次;
// 转移方程:
// (1)a,b都从上/下走过来
// (2)a,b一个上一个下走过来
// 共4种
//dp 数组代表a到哪,b到哪,可以不一样
int dp[11][11][11][11]={0},a[11][11]={0};
int main()
{
    int n,x,y,z,s;
    cin>>n;
    while(1){
        cin>>x>>y>>z;
        if(x==y&&y==z&&z==0) break;
        a[x][y]=z;
    }
for( int x1 = 1; x1 <= n; x1++ ) {
    for( int y1 = 1; y1 <= n; y1++ ) {
        for( int x2 = 1; x2 <= n; x2++ ) {
            for( int y2 = 1; y2 <= n; y2++ ){
                int t=max(dp[x1-1][y1][x2-1][y2],dp[x1][y1-1][x2][y2-1]);
                t=max(t,dp[x1-1][y1][x2][y2-1]);
                t=max(t,dp[x1][y1-1][x2-1][y2]);
                if(x1==x2&&y1==y2){
                    //代表到达同一位置,只能,加一次,每次都这样,就保证了前面的也不会重复加
                    dp[x1][y1][x2][y2]=t+a[x1][y1];
                }
                else dp[x1][y1][x2][y2]=t+a[x1][y1]+a[x2][y2];
            }
        }
    }
}
    cout<<dp[n][n][n][n]<<endl;
    return 0;
 }

 

posted @ 2020-06-06 21:00  西伯利亚挖土豆  阅读(184)  评论(0编辑  收藏  举报