多线程四维DP - 洛谷P1004方格取数
程序员文章站
2022-07-12 08:51:09
...
题意:洛谷p1004
给定一个的矩阵,初始你在点处,现找两条路径(只能往下或往右走,点可重复走,但走过的点权值变为)走到点处,使得你得到的权值之和最大。
分析:
不会的我看到这题第一想法就是跑两遍然后求和,然而。事实是跑两遍本质上和贪心是一样的,所以。然后我就学到了传说中的四维(然而可以降到三维我不会 )。
首先,表示从起点走到点和点最大权值之和。
因为只能往下和往右走,所以有四种状态转移。
第一条路往右,第二条路往下
第一条路往右,第二条路往右
第一条路往下,第二条路往下
第一条路往下,第二条路往右
要从这四个状态转移出最大的,所以有状态转移方程
因为是走到点和点所以还要加上他们本身的权值。
需要注意的一点,当和相等时,只用加一次。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10 + 5;
int n, x, y, z, pic[maxn][maxn], dp[maxn][maxn][maxn][maxn];
int main(){
cin >> n;
while(cin >> x >> y >> z){
if(x == 0 && y == 0 && z == 0) break;
pic[x][y] = z;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
for(int k = 1; k <= n; k++){
for(int u = 1; u <= n; u++){
dp[i][j][k][u] = max(max(dp[i - 1][j][k - 1][u], dp[i - 1][j ][k][u - 1]), max(dp[i][j - 1][k - 1][u], dp[i][j - 1][k][u - 1])) + pic[i][j] + pic[k][u];
if(i == k && j == u) dp[i][j][k][u] -= pic[i][j];
}
}
}
}
cout << dp[n][n][n][n] << '\n';
return 0;
}
加油学
上一篇: 洛谷P1004方格取数(四维DP)
下一篇: CSP-J 2020方格取数