先说下codevs1169吧,

题目链接: http://codevs.cn/problem/1169/

 

题意: 中文题诶~

 

思路: 多线程 dp

用 dp[i][j][k][l] 存储一个人在 (i, j), 一个人在 (k, l) 位置时对答案的最大贡献, 那么动态转移方程式为:

dp[i][j][k][l] = max(max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1]), max(dp[i][j - 1][k - 1][l], dp[i][j - 1][k][l - 1])) + a[i][j] + a[k][l]

注意: 如果 (i, j) 和 (k, l) 相同的话只能 a[i][j], a[k][l] 只计算一个

 

代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int MAXN = 51;
 5 int a[MAXN][MAXN], dp[MAXN][MAXN][MAXN][MAXN];
 6 
 7 int main(void){
 8     int n, m;
 9     cin >> n >> m;
10     for(int i = 1; i <= n; i++){
11         for(int j = 1; j <= m; j++){
12             cin >> a[i][j];
13         }
14     }   
15     for(int i = 1; i <= n; i++){
16         for(int j = 1; j <= m; j++){
17             for(int k = 1; k <= n; k++){
18                 for(int l = 1; l <= m; l++){
19                     dp[i][j][k][l] = max(max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1]), max(dp[i][j - 1][k - 1][l], dp[i][j - 1][k][l - 1]));
20                     if(i != k || j != l) dp[i][j][k][l] += a[k][l];
21                     dp[i][j][k][l] += a[i][j];
22                 }
23             }
24         }
25     }
26     cout << dp[n][m][n][m] << endl;
27     return 0;
28 }
View Code

相关文章:

  • 2021-09-30
  • 2021-12-19
  • 2022-02-09
  • 2021-12-25
  • 2022-12-23
  • 2021-10-29
  • 2021-05-09
  • 2021-09-02
猜你喜欢
  • 2021-10-04
  • 2022-12-23
  • 2022-12-23
  • 2021-09-24
  • 2021-09-16
  • 2022-12-23
相关资源
相似解决方案