[codeforces 580D]Kefa and Dishes
2015-10-06 00:27
281 查看
n很小,很容易想到状态压缩dp,用dp[set][i]表示结尾是i,用了set里的元素的最大值,枚举set和i来更新下一个元素即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
long long val[20],dp[300000][20];
long long n,m,k;
set<long long> s;
long long max(long long x,long long y){
return x>y?x:y;
}
long long decode(long long x){
long long ret=0;
for(long long i=1;i<=n;i++){
if(x&1){s.insert(i);ret++;}
x>>=1;
}
return ret;
}
long long r[20][20];
int main(){
cin>>n>>m>>k;
for(long long i=1;i<=n;i++)cin>>val[i];
long long x,a,b;
memset(r,0,sizeof(r));
for(long long i=1;i<=k;i++){
cin>>a>>b>>x;
r[a][b]=x;
}
long long len=1<<n;long long ans=-1;
memset(dp,-1,sizeof(dp));
for(long long i=1;i<len;i++){
s.clear();
long long num=decode(i);
for(set<long long>::iterator j=s.begin();j!=s.end();j++){
long long jj=*j;if(num==1)dp[i][jj]=val[jj];
if(num==m)ans=max(ans,dp[i][jj]);
for(long long l=1;l<=n;l++)
if(s.find(l)==s.end())
dp[i|(1<<(l-1))][l]=max(dp[i|(1<<(l-1))][l],dp[i][jj]+r[jj][l]+val[l]);
}
}
cout<<ans<<endl;
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
long long val[20],dp[300000][20];
long long n,m,k;
set<long long> s;
long long max(long long x,long long y){
return x>y?x:y;
}
long long decode(long long x){
long long ret=0;
for(long long i=1;i<=n;i++){
if(x&1){s.insert(i);ret++;}
x>>=1;
}
return ret;
}
long long r[20][20];
int main(){
cin>>n>>m>>k;
for(long long i=1;i<=n;i++)cin>>val[i];
long long x,a,b;
memset(r,0,sizeof(r));
for(long long i=1;i<=k;i++){
cin>>a>>b>>x;
r[a][b]=x;
}
long long len=1<<n;long long ans=-1;
memset(dp,-1,sizeof(dp));
for(long long i=1;i<len;i++){
s.clear();
long long num=decode(i);
for(set<long long>::iterator j=s.begin();j!=s.end();j++){
long long jj=*j;if(num==1)dp[i][jj]=val[jj];
if(num==m)ans=max(ans,dp[i][jj]);
for(long long l=1;l<=n;l++)
if(s.find(l)==s.end())
dp[i|(1<<(l-1))][l]=max(dp[i|(1<<(l-1))][l],dp[i][jj]+r[jj][l]+val[l]);
}
}
cout<<ans<<endl;
return 0;
}
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- 01背包问题