hdu2686_多线程dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686

题意:从(1, 1)到(n, n)再到(1, 1).

右下到左上只能左, 上;左上到右下只能右,下。

思路:设两个人同时从(1, 1)出发,如果同时到(i, j),跳过

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int dp[35][35][35], num[35][35], n;
 8 int main()
 9 {
10     while(~scanf("%d", &n))
11     {
12         for(int i = 1; i <= n; i++)
13             for(int j = 1; j <= n; j++)
14                 scanf("%d", &num[i][j]);
15         memset(dp, 0, sizeof(dp));
16         dp[1][1][1] = num[1][1];
17         for(int i = 1; i <= n; i++)
18         {
19             for(int j = 1; j <= n; j++)
20             {
21                 for(int k = 1; k < i + j && k <= n; k++)
22                 {
23                     if(i == n && j == n)
24                         dp[i][j][k] = num[n][n] + max(dp[n - 1][n][n], dp[n][n - 1][n - 1]);
25                     else if(i == k)
26                         continue;
27                     else
28                     {
29                         dp[i][j][k] = num[i][j] + num[k][i + j - k] + max(max(dp[i - 1][j][k - 1], dp[i][j - 1][k - 1]), max(dp[i - 1][j][k], dp[i][j - 1][k]));
30                     }
31                 }
32             }
33         }
34         printf("%d
", dp[n][n][n]);
35     }
36     return 0;
37 }
原文地址:https://www.cnblogs.com/luomi/p/5544237.html