方格取数问题的一般解法(DP)
查看原帖
方格取数问题的一般解法(DP)
1603098
J_Grigg楼主2024/12/1 14:46

方格取数问题

#include <iostream>

using namespace std;

const int N = 20;

int f[N][N][N]; //// f[k][i1][i2] : 共走k步,甲此时在w[i1][k-i1], 乙此时在w[i2][k-i2]
int w[N][N];

int main()
{
    int n;
    cin >> n;
    
    int a, b, c;
    while (cin >> a >> b >> c, a || b || c) 
    {
        w[a][b] = c;
    }
    
    for (int k = 1 ; k <= n * 2 ; k ++)
        for (int i1 = 1 ; i1 <= n ; i1 ++)
            for (int i2 = 1 ; i2 <= n ; i2 ++)
            {
                int j1 = k - i1, j2 = k - i2;
                if (j1 > 0 && j1 <= n && j2 > 0 && j2 <= n)
                {
                    int &x = f[k][i1][i2]; 
                    int t = w[i1][j1];
                    if (i1 != i2) t += w[i2][j2];
                    
                    x = max(x, f[k-1][i1][i2] + 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-1][i2-1] + t);
                }
            }
    
    cout << f[n * 2][n][n] << endl;
    
    return 0;
}
2024/12/1 14:46
加载中...