【DP】 HDU 2686 Matrix 多线程DP
dp[ K ][ X1 ][ X2 ] 表示第K步走到第一条路的坐标为X1 K-X1 第二条路的坐标为X2 K-X2;
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <cmath> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #include <time.h>; #define cler(arr, val) memset(arr, val, sizeof(arr)) #define FOR(i,a,b) for(int i=a;i<=b;i++) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 61; const int MAXM = 200006; const int INF = 0x3f3f3f3f; const int mod = 10000007; int mp[MAXN][MAXN],dp[MAXN][MAXN][MAXN]; int main() { int n; //IN; while(~scanf("%d",&n)) { cler(dp,0); cler(mp,0); FOR(i,1,n) FOR(j,1,n) scanf("%d",&mp[i][j]); for(int k=1;k<=2*n-1;k++) { for(int i=1;i<k;i++) { for(int j=1;j<k;j++) { if(i>n||j>n||i==j) continue; dp[k][i][j]=max(max(max(dp[k-1][i][j],dp[k-1][i-1][j]),dp[k-1][i][j-1]),dp[k-1][i-1][j-1])+mp[i][k-i]+mp[j][k-j]; } } } dp[2*n][n][n]=max(dp[2*n-1][n-1][n],dp[2*n-1][n][n-1])+mp[n][n]+mp[1][1]; printf("%d\n",dp[2*n][n][n]); } return 0; }