当前位置: 首页 > news >正文

[GN] DP学习笔记板子

文章目录

    • Bitset
    • 滚动数组
    • 多重背包
    • 区间DP
    • 树形dp
    • 状压dp
    • 模拟退火


Bitset

使用bitset需要引用<bitset>头文件。

其声明方法为:

std::bitset<N>s;  (N为s长度)

常用函数:

b.any()			判断b中是否存在值为1的二进制位
b.none()		判断b中是否不存在值为1的二进制位
b.count()		判断b中值为1的二进制位个数
b.size()		判断b中二进制位的个数
b[pos]			访问b中在pos处的二进制位
b.test(pos)		判断b中在pos处的二进制位是否为1
b.set()			把b中所有二进制位都置为1
b.set(pos)		把b[pos]置为1
b.reset()		把b中所有二进制位都置为0
b.reset(pos)	把b[pos]置为0
b.flip()		把b中所有二进制位逐位取反
b.flip(pos)		把b[pos]取反

滚动数组

   	memset(dp, inf, sizeof(dp)) ;dp[0][N]=0;for(int k = 1, i = 1; i <= n; i ++, k ^= 1){memset(dp[k], inf, sizeof(dp[k])) ;for(int j = -5000; j <= 5000; j ++)dp[k][j + N] = min(dp[k ^ 1][j + c[i] + N], dp[k ^ 1][j - c[i] + N] + 1) ;}int ans;for(int i=0;i<=5000;i++){ans=min(dp[n&1][i+N],dp[n&1][-i+N]);if(ans<1000) break;}

多重背包

       //分堆过程while(k<=s){//小于等于和小于都可以,因为如果出现等于的情况就是s=2^(k+1)-1,下面的if判断会处理掉cnt++;//cnt先++=>下标从1开始w[cnt] = k * wi;//k个物品为一堆v[cnt] = k * vi;s-=k;k*=2;}if(s>0){//如果存在最后一个堆cnt ++;//最后一个堆有s'个i物品w[cnt] = s * wi;v[cnt] = s * vi;}}n = cnt;//物品由n个变成了nlogs个 别忘了这句

区间DP

    for (int len = 1; len <= n; len++) {         // 区间长度for (int i = 1; i + len - 1 <= n; i++) { // 枚举起点int j = i + len - 1;                 // 区间终点if (len == 1) {dp[i][j] = 初始值continue;}for (int k = i; k < j; k++) {        // 枚举分割点,构造状态转移方程dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + w[i][j]);}}}

树形dp

void dfs(int u,int fa){for(int i=0;i<g[u].size();i++){int v = g[u][i];if(v==fa) continue;dfs(v,u);for(int k=m;k>=0;k--)for(int j=1;j<=k;j++)dp[u][k] = max(dp[u][k],dp[u][k-j]+dp[v][j]);}for(int i=m;i>=1;i--){dp[u][i] = dp[u][i-1] + w[u];}}

状压dp

f[0] = 0;
for (int mask = 1; mask < (1 << n); ++mask) {for (int i = 0; i < n; ++i) {if (mask & (1 << i)) {f[mask] = min(f[mask], f[mask ^ (1 << i)] + (nums1[__builtin_popcount(mask) - 1] ^ nums2[i]));}}
}return f[(1 << n) - 1];int f[17][1<<17];
int dfs(int x,int y){if(f[x][y])return f[x][y];int ans=0;for(auto i:v[st[x][st[x].size()-1]])if(!((y>>(i-1))&1))ans=max(ans,dfs(i,y|(1<<(i-1))));return f[x][y]=ans+st[x].size();
}for(int i=1;i<=n;i++)cin>>st[i],v[st[i][0]].push_back(i);for(int i=1;i<=n;i++)ans=max(ans,dfs(i,(1<<(i-1))));1.是方格图求状态数、最大最小值。这种题一般是把每一行/列看做一个状态来转移的。预处理出每一行的所有状态,然后根据状态转移方程进行转移。该状态左右不相邻: !(i& i<< 1) 2.给你一个集合,然后每次从中选出一个数,选过的数不能再选dp[st] += dp[st^(1<<(i-1))]     (st&(1<<(i-1)) != 0)

模拟退火

const double eps=1e-18;
const double delta=0.999;//调了一年的参数一般为0.97~1.0class Solution {
public:vector<int> a,b;int ans=INT_MAX;//答案double fun(){int res=0;for(int i=0;i<a.size();i++)res+=(a[i]^b[i]);ans=min(ans,res); //取最小return res;}int sa(){random_shuffle(b.begin(), b.end()); //打乱,随机分布int n=a.size();for(double t=1e6;t>eps;t*=delta){int x=rand()%n,y=rand()%n;int last=fun(); //没有交换前的异或值之和swap(b[x],b[y]); //交换后的异或值之和int now=fun();int de=now-last;if(de<0){ //比当前优秀就要}else if(!(exp(-1.0*de/t)*RAND_MAX>rand()))  // 模拟退火的法则,我也搞不懂,背一下就好了swap(b[x],b[y]);  //不符合法则,回溯。}return ans;}int minimumXORSum(vector<int>& nums1, vector<int>& nums2) {for(int i:nums1) a.push_back(i);for(int i:nums2) b.push_back(i);return sa();}
};

相关文章:

  • Next.js如何正确处理跨域问题?
  • 网络ADB连接(不用实体安卓线)
  • 每日一练:LeeCode-404、左叶子之和【二叉树】
  • IDEA:git 回滚本地提交-git 选择 Reset Current Branch to
  • 《区块链简易速速上手小册》第4章:区块链与加密货币(2024 最新版)
  • Vue2:请求接口的两种方式axios和vue-resource
  • 大模型重塑车载语音交互:赛道巨头如何引领新周期?
  • 力扣0114——二叉树展开为链表
  • Python爬虫请求库安装
  • Spring Cloud使用笔记
  • 判断一个字符串中出现次数最多的字符,统计这个次数?
  • C++——特殊类
  • Flink 添加 / 部署 Jar 包的若干注意事项
  • Python与CAD系列高级篇(二十五)分类提取坐标到excel(补充圆半径、线长度、圆弧)
  • ES6 模块化、CommonJS 模块化的区别经典面试题
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 2017前端实习生面试总结
  • android 一些 utils
  • PV统计优化设计
  • SpringBoot 实战 (三) | 配置文件详解
  • SQLServer之创建数据库快照
  • vue 个人积累(使用工具,组件)
  • Vue官网教程学习过程中值得记录的一些事情
  • webgl (原生)基础入门指南【一】
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 大型网站性能监测、分析与优化常见问题QA
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 数组的操作
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 怎样选择前端框架
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 数据库巡检项
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (06)Hive——正则表达式
  • (175)FPGA门控时钟技术
  • (C语言)共用体union的用法举例
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm码农论坛 毕业设计 231126
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .md即markdown文件的基本常用编写语法
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET CLR Hosting 简介
  • .NET MVC 验证码
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .Net各种迷惑命名解释
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET中winform传递参数至Url并获得返回值或文件
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .net专家(高海东的专栏)
  • [ C++ ] STL_vector -- 迭代器失效问题