|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
AcWing.274
用时 2 h
提交 3 次
知识点
线性dp
思路
f[i][a][b]
阶段: 完成了前 i 个任务
状态: 位置: a, b, p[i]
决策: 三个人选一个去下个状态
初始: f[0][1][2] / f[0][2][1], p[0] = 3
终点: min(f[n][x][y])
需要进步的地方
状态转移的时候一定要看这个状态合法不合法, 及时跳过
初始状态不仅仅是 dp 数组 , 可能包含别的数组的值也要初始化
状态转移的两种思路: i 到 i + 1 / i - 1 到 i
代码
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 205;
- int f[N*5][N][N];
- int c[N][N], p[N*5];
- int l, n, ans = INT_MAX;
- int main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- cin >> l >> n;
- for(int i = 1; i <= l; i++){
- for(int j = 1; j <= l; j++){
- cin >> c[i][j];
- }
- }
- for(int i = 1; i <= n; i++){
- cin >> p[i];
- }
- memset(f, 0x3f, sizeof(f));
- f[0][1][2] = f[0][2][1] = 0;
- p[0] = 3;
- for(int i = 0; i < n; i++){
- for(int x = 1; x <= l; x++){
- for(int y = 1; y <= l; y++){
- int u = p[i], v = p[i + 1], b = f[i][x][y];
- if(x == y || x == u || y == u) continue;
- if(x != v && y != v) f[i + 1][x][y] = min(f[i + 1][x][y], b + c[u][v]);
- if(x != v && u != v) f[i + 1][x][u] = min(f[i + 1][x][u], b + c[y][v]);
- if(u != v && y != v) f[i + 1][u][y] = min(f[i + 1][u][y], b + c[x][v]);
- }
- }
- }
- for(int x = 1; x < l; x++){
- for(int y = x + 1; y <= l; y++){
- if(x == p[n] || y == p[n]) continue;
- ans = min(ans, f[n][x][y]);
- }
- }
- cout << ans;
- return 0;
- }
复制代码
|
|