vijos 1456 最小總代價(狀壓dp)

題目鏈接

題解:這題就是普通的狀壓dp 設 二維dp[i][j] 表示爲 在i狀態下 物品在第j個人手上的最小代價花費。

初始化要注意一下。

#include<bits/stdc++.h>
using namespace std;
const int N = 20, M = (1 << 17);
int dp[M][N], mp[N][N];
int main()
{
	int n, mx;
	scanf("%d", &n);
	for(int i = 0; i < n; ++i)
	for(int j = 0; j < n; ++j)
	scanf("%d", &mp[i][j]);
	mx = (1 << n);
	memset(dp, 0x3f, sizeof dp);
	for(int i = 0; i < n; ++i)
	dp[1<<i][i] = 0;

	for(int i = 0; i < mx; ++i)
	for(int j = 0; j <  n; ++j)
	if(((1<<j) & i)==0)
	for(int z = 0; z < n; ++z)
	if(j != z &&((1 << z) & i))
		dp[i^(1<<j)][j] = min(dp[i^(1<<j)][j], dp[i][z] + mp[z][j]);
	
	int ans = 1e9;
	for(int i = 0; i < n; ++i)
	ans = min(ans, dp[mx - 1][i]); 
	printf("%d\n", ans);
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章