CF 580 D Kefa And Dishes 상 압 DP

제목: n 개의 아 이 템, i 번 째 아 이 템 의 가 치 는 a [i] 입 니 다. 지금 m 개의 아 이 템 을 선택해 야 합 니 다.
k 개 보너스 가 있 습 니 다. 아 이 템 x 가 아 이 템 y 앞 에 있 으 면 총 가치 + a [x] [y]
m < = n < = 18, 0 < = a [i], c [x] [y] < = 1e9. 선택 할 수 있 는 최대 가 치 는?
폭력 dfs O (C (n, m) * m!) TLE....
그림 (i - > j) 의 변 권 치 는 (a [i] + c [i] [j]) 입 니 다.
지금 은 길이 가 m - 1 이 고 가중치 가 가장 큰 경 로 를 찾 습 니 다.
뚜렷 한 상 압. dp [s] [u] 를 설정 하면 u 점 을 표시 하고 지나 간 점 의 상 태 는 s 입 니 다.
dp[s][u] + a[j]+c[u][j] -> dp[s|2^j][j]   (u 는 s 에 있 고 j 는 더 이상 s 가 아니다)
res=max(res, dp[s][i] (i=1..n && bit(s)==m))
#include 
using namespace std;
typedef long long ll;
const int N=19;
int n,m,k;
ll a[N],b[N][N];
ll dp[1<>n>>m>>k;
	for(int i=0;i>a[i];
	while(k--)
	{
		ll u,v,x;
		cin>>u>>v>>x;
		u--,v--;
		b[u][v]=x;
	}
	for(int i=0;i>j)&1))
				continue;
			for(int k=0;k>k)&1) 
					continue;
				dp[i|(1<>j)&1)
				cnt++;
		if(cnt==m)
		{
			for(int j=0;j

좋은 웹페이지 즐겨찾기