做了一道闯关游戏题目,题目编号是5729,运用到状态压缩DP的思想,下面是我的代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 20, M = 1 << N;
LL f[M][N];
int w[N];
int g[N][N];
int main()
{
int n, m, k;
cin >> n >> m >> k;
for(int i = 0;i < n; i ++) scanf("%d", &w[i]);
for(int i = 0; i < k; i ++)
{
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
g[x - 1][y - 1] = c;
}
//初始化状态压缩DP
for(int i = 0; i < n; i ++) f[1 << i][i] = w[i];
for(int i = 0; i < 1 << n; i ++)
{
for(int j = 0; j < n; j ++)
{
if(i >> j & 1)
{
for(int k = 0; k < n; k ++)
{
if(k !=j && i >> k & 1)
{
f[i][j] = max(f[i][j], f[i - (1 << j)][k] + g[k][j] + w[j]);
}
}
}
}
}
LL res = 0;
for(int i = 0; i < 1 << n; i ++)
{
int cnt = 0;
for(int j = 0; j < n; j ++)
{
if(i >> j & 1)
cnt ++;
}
if(cnt == m)
{
for(int j = 0;j < n; j ++)
{
res = max(res, f[i][j]);
}
}
}
cout << res << endl;
return 0;
}
然后2又遇到了一道类似的题目,记录一下
这道题目是 731 毕业旅行
#include<iostream>
#include<cstring>
using namespace std;
const int N = 20, M = 1 << N, INF = 0x3f3f3f3f;
int n;
int g[N][N], f[M][N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
scanf("%d", &g[i][j]);
memset(f, 0x3f, sizeof f);
f[1][0] = 0;
for(int i = 1; i < 1 << n; i += 2)
for(int j = 0; j < n; j ++)
{
if(i >> j & 1)
{
for(int k = 0; k < n; k ++)
{
if(i - (1 << j) >> k & 1)
{
f[i][j] = min(f[i][j], f[i - (1 << j)][k] + g[k][j]);
}
}
}
}
int res = INF;
for(int i = 1; i < n; i ++)
{
res = min(res, f[(1 << n) - 1][i] + g[i][0]);
}
printf("%d\n", res);
return 0;
}