CF-580D Kefa and Dishes (状压dp)
时间:2019-08-20
本文章向大家介绍CF-580D Kefa and Dishes (状压dp),主要包括CF-580D Kefa and Dishes (状压dp)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题链接:CodeForces - 580D
题意:给你n种菜,吃每种菜都会得到对应的满足值。给出k种buff,如果先吃a再吃b 满足感就会提升c。最后你要吃共m种菜,能获得的最大满足值为多少。
思路:一开始会想到最短路之类的,相当于有向图。但是这是多源出发的最长路径(不会....),在看看题目范围 最多也就18种菜。所以我们就暴力状态dp一下,来得到结果。
code: (dp要开long long)
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5; long long dp[(1<<18)+5][18+5]; int arr[20]; int g[20][20]; int num[1<<18]; void getnum(){ for(int i = 0;i<(1<<18);i++){ for(int j=0;j<18;j++){ if(i&(1<<j)) num[i]++; } } } int main(){ getnum(); int n,m,q; while(cin>>n>>q>>m){ for(int i=0;i<n;i++){ cin>>arr[i]; } memset(g,0,sizeof(g)); for(int i=0;i<m;i++){ int u,v,w; cin>>u>>v>>w; g[u-1][v-1] = w; } memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ dp[1<<i][i] = arr[i]; } long long ans = 0; for(int i=0;i<(1<<n);i++){ for(int j=0;j<n;j++){ if(!(i&(1<<j))) continue;//判断右数第j位是否为1 for(int k=0;k<n;k++){ if(i&(1<<k)) continue; int state = i|(1<<k);//将i上右数第k位变为1 dp[state][k] = max(dp[state][k],dp[i][j]+g[j][k]+arr[k]); } if(num[i]==q) ans = max(ans,dp[i][j]); } } cout<<ans<<endl; } }
原文地址:https://www.cnblogs.com/Tianwell/p/11381835.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii2.0实现的批量更新及批量插入功能示例
- PDO::inTransaction讲解
- 小程序前后端交互使用JWT
- python文件操作seek()偏移量,读取指正到指定位置操作
- 使用OpenCV去除面积较小的连通域
- 使用vs code编辑调试php配置的方法
- Python OpenCV去除字母后面的杂线操作
- PDO::rollBack讲解
- PyTorch的torch.cat用法
- keras在构建LSTM模型时对变长序列的处理操作
- Discuz不使用插件实现简单的打赏功能
- Pytorch学习之torch用法—-比较操作(Comparison Ops)
- PHP里的$_GET数组介绍
- PHP中$GLOBALS与global的区别详解
- MyBatis源码解析之基础模块—Log