0
点赞
收藏
分享

微信扫一扫

提高课二刷疑难杂题

史值拥 2022-04-22 阅读 62
算法

方格取数

#include<bits/stdc++.h>
using namespace std;
const int N=11;
int g[N][N];
int f[2*N][N][N]; // 假设有两个小朋友在同时从A走向B,g[k][i1][i2]=w,表示第一个小朋友
//走到第(i1,k-i1),第二个小朋友走到(i2,k-i2)时的最小值为w
int main(){
    int n;
    cin >> n;
    int a,b,c;
    while(cin>>a>>b>>c,a){
        g[a][b]=c;
    }
    for(int k=2;k<=2*n;k++){//从A走到B必然要走2*n-2次(曼哈顿距离),k要从2开始因为一步没走时在(1,1)点
        for(int i1=1;i1<=n;i1++){
            for(int i2=1;i2<=n;i2++){
                int j1=k-i1,j2=k-i2;
                if(j1<=n&&j1>=1&&j2<=n&&j2>=1){
                    //我们惊奇的发现,两人可能同时到达同一格子,这时只取一次t就行了
                    //不可能出现1人走到了另一人已经走过的格子上这种情况
                    int &x=f[k][i1][i2];
                    int t = g[i1][j1];
                    if(i1!=i2) t += g[i2][j2];
                    x = max(x, f[k-1][i1-1][i2-1]+t);
                    x = max(x, f[k-1][i1-1][i2]+t);
                    x = max(x, f[k-1][i1][i2-1]+t);
                    x = max(x, f[k-1][i1][i2]+t);
                }
            }
        }
    }
    cout << f[2*n][n][n] << endl;
    return 0;
}

参考题解

举报

相关推荐

0 条评论