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

【羊圈——状压 + DP / 记忆化搜索DP】

题目

一般DP代码(注意,这里只能向外推(起始状态是f(1,0),不能向内推(不然会导致之前的羊圈被割裂))

#include <bits/stdc++.h>
using namespace std;const int MAX_N = 210;
const int MAX_M = 16;int n, m;
double p[MAX_N];
int l[MAX_M];
double dp[MAX_N][1 << MAX_M];int main() {cin >> m >> n;for (int i = 1; i <= m; i++) cin >> l[i];for (int i = 1; i <= n; i++) cin >> p[i];int mask = 1 << m;for (int i = 0; i <= n + 1; i++) {for (int j = 0; j < mask; j++) {dp[i][j] = 1e18;}}dp[1][0] = 0;for (int u = 1; u <= n; u++) {for (int s = 0; s < mask; s++) {if (dp[u][s] == 1e18) continue;// 不覆盖当前羊uif (u + 1 <= n + 1) {dp[u + 1][s] = min(dp[u + 1][s], dp[u][s] + p[u]);}// 尝试用未使用的羊圈i覆盖for (int i = 1; i <= m; i++) {if (!(s & (1 << (i - 1))) && u + l[i] - 1 <= n) {int new_s = s | (1 << (i - 1));dp[u + l[i]][new_s] = min(dp[u + l[i]][new_s], dp[u][s]);}}}}double ans = 1e18;for (int s = 0; s < mask; s++) {ans = min(ans, dp[n + 1][s]);}printf("%.2lf\n", ans);return 0;
}

记忆化搜索DP代码

#include <bits/stdc++.h>
using namespace std;
using db = double;int n, m;
db p[210];
int w[20];
db dp[210][(1 << 15) + 10];db f(int u, int s)
{if(u >= n+1) return 0;if(dp[u][s] != -1) return dp[u][s];db ret = 1e18;//不用,状态不变,但是值要增加(这里的值指的是逃跑期望)ret = p[u] + f(u+1, s);//用for(int i = 1; i <= m; i++){if(!(s & (1 << (i-1))) && u + w[i] - 1 <= n){ret = min(ret, f(u+w[i], s | (1 << (i-1))));}}return dp[u][s] = ret;
}
int main()
{cin >> m >> n;for(int i = 1; i <= m; i++)cin >> w[i];for(int i = 1; i <= n; i++)cin >> p[i];for(int i = 1; i <= n; i++)	for(int j = 0; j < 1 << m; j++)dp[i][j] = -1;printf("%.2lf", f(1, 0));
}

感想

另外勘误

这题很多解法都是没看到“最多”吗

为什么要加这个限制?

#include <bits/stdc++.h>
using namespace std;
using db = double;int n, m;
db p[210];
int w[20];
db dp[210][(1 << 15) + 10];db f(int u, int s)
{if(u >= n+1) return 0;if(dp[u][s] != -1) return dp[u][s];db ret = 1e18;//不用,状态不变,但是值要增加(这里的值指的是逃跑期望)ret = p[u] + f(u+1, s);//用for(int i = 1; i <= m; i++){if(!(s & (1 << (i-1)))){ret = min(ret, f(u+w[i], s | (1 << (i-1))));}}return dp[u][s] = ret;
}
int main()
{cin >> m >> n;for(int i = 1; i <= m; i++)cin >> w[i];for(int i = 1; i <= n; i++)cin >> p[i];for(int i = 1; i <= n; i++)	for(int j = 0; j < 1 << m; j++)dp[i][j] = -1;printf("%.2lf", f(1, 0));
}

http://www.xdnf.cn/news/608455.html

相关文章:

  • 【办公类-18-06】20250523(Python)“口腔检查涂氟信息”批量生成打印(学号、姓名、学校、班级、身份证、户籍、性别、民族)
  • 冒泡排序:轻松理解与实现
  • 新能源汽车产业链图谱分析
  • python学习day2:运算符+优先级
  • 【沉浸式求职学习day47】【JSP详解】
  • Java—— 网络爬虫
  • Redis 8.0 新增数据结构深度解析:从核心功能到生态重构
  • 【数据架构04】数据湖架构篇
  • Flutter跨平台通信实战|3步打通Android原生能力,实现底层API调用!
  • Flutter - 国际化
  • Flutter 3.32 升级要点全解析
  • ros2 humble安装ros-humble-tf2-tools
  • 布丁扫描高级会员版 v3.5.2.2| 安卓智能扫描 APP OCR文字识别小助手
  • 数字人交互系统哪家强?品牌技术对比!
  • JavaScript进阶(十二)
  • 【AS32X601驱动系列教程】GPIO_点亮LED详解
  • 在bash中,如何打开特定文件,使用特定字符串替换特定字符串?请编写代码
  • 哈希表的实现(上)
  • mac将自己网络暴露到公网
  • ROS云课三分钟-cmake gcc g++ 默认版本和升级-250523
  • 前后端联调实战指南:Axios拦截器、CORS与JWT身份验证全解析
  • 提示词工程框架——CO-STAR 框架实战
  • 江科大DMA直接存储器访问hal库实现
  • 深度剖析 MCP SDK 最新版:Streamable HTTP 模式
  • 学习黑客Nmap 是什么?
  • 数据结构 -- 交换排序(冒泡排序和快速排序)
  • 信息安全管理与评估赛项参考答案-模块1网络平台搭建
  • 【软件测试】第三章·软件测试基本方法(基于需求的测试方法)
  • Trae+12306 MCP,10分钟搭建行程可视化助手
  • Gmsh 代码深度解析与应用实例