先说下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 }