标签:const 1800 int ll 状压 CodeForces 物品 20 include
D. Kefa and Dishes
范围比较小可以用二进制暴力枚举
限制条件:前后相邻的拿的物品有贡献,所以状态要记录最后一个拿的物品,记录所有物品的状态,暴力枚举物品状态,枚举前一个后一个物品
点击查看代码
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <stack>
#include <cstdio>
#include <queue>
#include <set>
#include<sstream>
#include <cstring>
#include <cmath>
#include <bitset>
//#pragma GCC optimize(2);
#define IOS ios::sync_with_stdio(false);
#define mm(a, b) memset(a, b, sizeof(a))
const double PI = acos(-1.0);
typedef long long ll;
const int N = 1e5+5;
const int M = N*2;
const double eps =1e-8;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double maxd = -1e9;
const int maxn = 500;
using namespace std;
typedef pair<string,int> PII;
int a[20];
int g[20][20];
ll f[20][1<<20];
//dp[i][j] 最后吃的是i,当前的状态j
// k上一次吃的是k ,上一状态q
//dp[i][j] = max(dp[i][j],dp[k][q]+a[i]+g[k][i]);
int main(){
int n,m,k,xi,yi,ci;
cin>>n>>m>>k;
for(int i=0;i<n;i++)cin>>a[i];
while(k--){
cin>>xi>>yi>>ci;
g[--xi][--yi] = ci;
}
ll ans = 0;
memset(f,0,sizeof f);
for(int j=0;j<(1<<n);j++){
int sum = 1;
int t = j;
while(t&(t-1)) t= t&(t-1),sum++;//统计吃了多少个
for(int i=0;i<n;i++){
if(j&(1<<i)){
for(int k=0;k<n;k++){
if(j&(1<<k)){
int q = j - (1<<i);
f[i][j] = max(f[i][j],f[k][q]+a[i]+g[k][i]);
}
}
}
if(sum == m) ans = max(ans,f[i][j]);
}
}
cout<<ans<<endl;
return 0;
}
标签:const,1800,int,ll,状压,CodeForces,物品,20,include 来源: https://www.cnblogs.com/muscletear/p/15337446.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。