CF #321 (Div. 2) D
不说了,爆内存好几次,后来醒起状态有重复。。。
状压+TSP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define LL long long
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
const int MAX=100005;
int pre[20][20];
int dish[20];
LL dp[20][1<<20];
template<class T>
inline T IN(T &num){
num = 0;
char c = getchar(), f = 0;
while(c != '-' && (c < '0' || c > '9')) c = getchar();
if(c == '-') f = 1, c = getchar();
while('0' <= c && c <= '9') num = num * 10 + c - '0', c = getchar();
if(f) num = -num;
return num;
}
struct Status{
int l,s;
Status(){};
Status(int ll,int ss){l=ll,s=ss;}
};
int main(){
int n,m,k;
int x,y,c;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
queue<Status>que;
memset(pre,0,sizeof(pre));
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;i++)
IN(dish[i]);
for(int i=1;i<=k;i++){
IN(x),IN(y),IN(c);
pre[x][y]=c;
}
LL ans=0;
for(int i=1;i<=n;i++){
dp[i][1<<i]=dish[i];
ans=max(ans,(LL)dish[i]);
que.push(Status(i,1<<i));
}
Status tmp; int e;
for(int i=2;i<m;i++){
int sz=que.size();
while(sz--){
tmp=que.front();
que.pop();
for(int j=1;j<=n;j++){
if(tmp.s&(1<<j)){
}
else{
k=tmp.l; e=tmp.s|(1<<j);
if(dp[j][e]==-1) que.push(Status(j,e));
dp[j][e]=max(dp[j][e],dp[k][tmp.s]+pre[k][j]+dish[j]);
}
}
}
}
if(m>=2){
while(!que.empty()){
tmp=que.front();
que.pop();
for(int j=1;j<=n;j++){
if(tmp.s&(1<<j)){
}
else{
k=tmp.l; e=tmp.s|(1<<j);
dp[j][e]=max(dp[j][e],dp[k][tmp.s]+pre[k][j]+dish[j]);
ans=max(ans,dp[j][e]);
}
}
}
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号