HDOJ-2686 Matrix

多线程dp, 两个人同时从起点出发,沿着不相交的路径到达终点,获得的最大value。用dp[i][j][h]表示两个人都用了i步,一个人走到了j行,一个人走到了h行获得的最大value.
状态转移方程;dp[i][j][h] = max(max(dp[i-1][j-1][h], dp[i-1][j-1][h-1]), max(dp[i-1[j][h], dp[i-1][j][h-1]) + d;
d表示两个人所在格子的value值。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <queue> 
#include <cstring>
#define INF 1e18

using namespace std;
typedef long long ll;

int dp[100][35][35];
int num[35][35];
int main(){

// freopen("in.txt", "r", stdin);
    int n;

    while(scanf("%d", &n) == 1){

        memset(dp, 0, sizeof(dp));
        for(int i = 1; i <= n; i++)
          for(int j = 1; j <= n; j++)
           scanf("%d", &num[i][j]);

        dp[0][1][1] = num[1][1];
        for(int i = 1; i < 2 * n - 1; i++)
            for(int j = 1; j <= n && j <= i+1; j++)
              for(int h = 1; h <= n && h <= i+1; h++){

                if(j == h && j != n)
                 continue;
                if(i > j+n-2 || i > h+n-2)
                 continue;
                int h1 = dp[i-1][j][h];
                int h2 = dp[i-1][j-1][h];
                int h3 = dp[i-1][j-1][h-1];
                int h4 = dp[i-1][j][h-1];
                dp[i][j][h] = max(max(h1, h2), max(h3, h4));
                int y1 = i - j + 2;
                int y2 = i - h + 2;
                if(j == h)
                 dp[i][j][h] += num[j][y1];
                else{
                    dp[i][j][h] += num[j][y1] + num[h][y2];
                }
              }
            cout << dp[2*n-2][n][n] << endl;
          }  
        return 0;
}

你可能感兴趣的:(HDOJ-2686 Matrix)