Codeforces Round 580 D. Kefa and Dishes (状态压缩dp)
来源:互联网 发布:淘宝手机助手登陆失败 编辑:程序博客网 时间:2024/06/05 23:49
题意:一共n道菜,吃m道,有k个规则,每个菜有自己的价值,每个规则说明吃完X接着吃Y可以额外获得Z个价值。
问可以获得的最大价值是多少。
思路:1<<18保存所有状态,第二维保存最后吃的哪道菜,然后从吃的菜里选一道,从没吃的菜里选一道,吃完X吃Y,
更新dp,判断一下是否当前吃了m道,更新ans便可,记忆化搜索也可以。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int Max=100005;const int INF=0x3f3f3f3f;long long dp[(1<<18)+10][20];int val[20],add[20][20];int n,m,k;int main(){ int x,y,value,tot,cnt; long long ans; while (scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(dp, 0, sizeof(dp)); memset(add, 0, sizeof(add)); for (int i=0; i<n; i++) scanf("%d",&val[i]); for (int i=0; i<k; i++) { scanf("%d%d%d",&x,&y,&value); add[x-1][y-1]=value; } for (int i=0; i<n; i++) dp[1<<i][i]=val[i]; tot=1<<n; ans=0; for (int i=0; i<tot; i++) //所有状态 { cnt=0; for (int j=0; j<n; j++) //已选了第j道 { if (i& (1<<j)) { cnt++; for (int k=0; k<n; k++) //选第k道 { if ((i& (1<<k))==0) dp[i | (1<<k)][k]=max(dp[i | (1<<k)][k],dp[i][j]+val[k]+add[j][k]); } } } if (cnt==m) { for (int j=0; j<n; j++) { if (i& (1<<j)) ans=max(ans,dp[i][j]); } } } printf("%lld\n",ans); } return 0;}
记忆化:
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int Max=100005;const int INF=0x3f3f3f3f;long long dp[(1<<18)+10][20];int val[20],add[20][20];int n,m,k;long long dfs(int x,int y,int z){ if (dp[x][y]!=-1) return dp[x][y]; dp[x][y]=0; if (z==m) return dp[x][y]; for (int i=0; i<n; i++) { if (((1 << i) & x) ==0) //当前未选择第i道菜 dp[x][y]=max(dp[x][y],dfs(((1<<i) | x), i, z+1)+val[i]+add[y][i]); } return dp[x][y];}int main(){ int x,y,value; while (scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(dp, -1, sizeof(dp)); memset(add, 0, sizeof(add)); for (int i=0; i<n; i++) scanf("%d",&val[i]); for (int i=0; i<k; i++) { scanf("%d%d%d",&x,&y,&value); add[x-1][y-1]=value; } printf("%lld\n",dfs(0,n+1,0)); } return 0;}
0 0
- Codeforces Round 580 D. Kefa and Dishes (状态压缩dp)
- codeforces 580D Kefa and Dishes【状态压缩+dp】
- Codeforces 580D Kefa and Dishes(dp+状态压缩)
- codeforces 321# D. Kefa and Dishes (状态压缩DP)
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes 位 状态压缩 dp
- Codeforces,Kefa and Dishes,状态压缩DP
- codeforces 580D. Kefa and Dishes dp
- codeforces 580 D.Kefa and Dishes(状压DP)
- CodeForces 580D Kefa and Dishes(DP)
- codeforces 580D Kefa and Dishes (状压dp)
- CodeForces 580D.Kefa and Dishes(状压DP)
- CodeForces 580 D.Kefa and Dishes(状压DP)
- CodeForces 580D (状压DP) Kefa and Dishes
- Codeforces Round #321 Kefa and Dishes(状压DP)
- Codeforces Round#321 Kefa and Dishes(状压DP)
- codeforces 580 D. Kefa and Dishes (状压dp)
- codeforces 580D. Kefa and Dishes(状压dp)
- Codeforces 580D Kefa and Dishes【状压dp】
- 深刻理解Python中的元类(metaclass)
- 反射机制是什么?
- 杭电acm1398
- 牛客网 | 把二叉树打印成多行
- Python的爬虫框架 Scrapy
- Codeforces Round 580 D. Kefa and Dishes (状态压缩dp)
- sql server中,N''表示什么意思?
- Android之可伸缩的皮筋效果(贝塞尔曲线)的介绍
- 判别分析
- Android图片加载框架比较----Glide,Picasso,Fresco
- UI之tabBarItem
- java变量,初始化快,构造函数的执行顺序,运算符的优先级(从高到低)
- 今天开始写博客了,加油!
- css中关于z-index的使用