Cow Exhibition G的来龙去脉

[USACO03FALL] Cow Exhibition G - 洛谷

曲折经过

爆搜

一开始没什么好的想法,就针对每头奶牛去or不去进行了爆搜。

#include <cstdio>
#include <algorithm>
using namespace std;#define maxn 405
int iq[maxn], eq[maxn];
int ans;
int n;void dfs(int k, int sumiq, int sumeq) {//printf("k:%d,sumiq %d, sumeq %d\n", k, sumiq, sumeq);if (k == n + 1) {if (sumiq < 0 | sumeq < 0) {return;}ans = max(ans, sumiq + sumeq);return;}dfs(k + 1, sumiq + iq[k], sumeq + eq[k]);dfs(k + 1, sumiq, sumeq);
}int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d %d", &iq[i], &eq[i]);}dfs(1, 0, 0);printf("%d\n", ans);return 0;
}

但这代码交上去有5个数据点T了,所以还是得想其他的办法,比如DP。 

二维DP

一开始设计了一个三维的状态,f[i][j][k]表示到第i头牛,智商和为j,情商和为k时的情商与智商和

但这数组有点太大了...

考虑到j,k两维的下标其实与数组值有一定关系,所以我们优化掉第三维,把状态改成f[i][j]表示到第i头牛,智商和为j时的情商和

又考虑到,智商和、情商和可能取到负数,为了保证数组下标的合法性,我们对数组下标整体进行了偏移

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;#define maxn 405
#define maxm 2005int iq[maxn], eq[maxn];
int ans, n;
int dp[maxn][maxm * maxn];int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d %d", &iq[i], &eq[i]);}memset(dp, -0x3f, sizeof(dp));dp[0][400000] = 0;for (int i = 1; i <= n; i++) {//合理调整dp边界if (iq[i] >= 0) {for (int j = iq[i]; j <= 800000; j++) {//for (int j = 800000; j >= iq[i]; j--) {dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - iq[i]] + eq[i]);//printf("dp[%d][%d]:%d\n", i, j, dp[i][j]);}} else {for (int j = 0; j <= 800000 + iq[i]; j++) {dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - iq[i]] + eq[i]);//printf("dp[%d][%d]:%d\n", i, j, dp[i][j]);}}}for (int j = 400000; j <= 800000; j++) {//智商和不能为负//printf("%d\n", dp[n][j] + j - 400000);if (dp[n][j] > 0)//情商和不能为负ans = max(ans, dp[n][j] + j - 400000);}printf("%d\n", ans);return 0;
}

 一些细节:

  • dp数组初始化成很小的数而非0,因为情商和有可能取负数
  • dp[0][400000]=0,偏移后的数组400000相当于零坐标,是合法状态
  • dp边界的处理
  • 找答案时的处理,且注意答案对应的是dp[n][j]+j,再减去总体偏移量400000

但MLE..

正解

一维DP

利用滚动数组优化

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;#define maxn 405
#define maxm 2005int iq[maxn], eq[maxn];
int ans, n;
int dp[maxm * maxn];int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d %d", &iq[i], &eq[i]);}memset(dp, -0x3f, sizeof(dp));dp[400000] = 0;for (int i = 1; i <= n; i++) {if (iq[i] >= 0) {for (int j = 800000; j >= iq[i]; j--) {dp[j] = max(dp[j], dp[j - iq[i]] + eq[i]);//printf("dp[%d][%d]:%d\n", i, j, dp[i][j]);}} else {for (int j = 0; j <= 800000 + iq[i]; j++) {dp[j] = max(dp[j], dp[j - iq[i]] + eq[i]);//printf("dp[%d][%d]:%d\n", i, j, dp[i][j]);}}}for (int j = 400000; j <= 800000; j++) {//printf("%d\n", dp[n][j] + j - 400000);if (dp[j] > 0)ans = max(ans, dp[j] + j - 400000);}printf("%d\n", ans);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】第十一站:list的介绍及使用

目录 list的介绍及使用 1.list的含义 2.list的介绍 3.list的使用 1.list的构造 2.list iterator的使用 3.list capacity 4.list element access 5 list modifiers 尾插尾删 和 头插头删 insert 和 erase resize swap clear 6.list sort and reverse 7.list copy vector copy li…

如何配置https端口?快解析https端口配置教程

https是在http的基础上加入了SSL128位加密&#xff0c;可使网站更加安全&#xff0c;大家都知道http协议使用的是80端口&#xff0c;而https使用的是443端口。起初一些网上银行使用https协议&#xff0c;用户必须安装证书才能正常浏览银行网站&#xff1b;后来是苹果公司强制要…

3、架构-事务处理

目录 概述 场景事例 本地事务 实现原子性和持久性 实现隔离性 概述 事务处理几乎在每一个信息系统中都会涉及&#xff0c;它存在的意义是为 了保证系统中所有的数据都是符合期望的&#xff0c;且相互关联的数据之间不 会产生矛盾&#xff0c;即数据状态的一致性&#xff0…

【挑战30天首通《谷粒商城》】-【第一天】10、环境-docker安装mysql

文章目录 课程介绍一、docker 安装 mysql Stage 1&#xff1a;下载镜像文件 Stage 1-1&#xff1a;打开官网查看镜像 Stage 1-2&#xff1a;拉取镜像 Stage 1-3&#xff1a;查看拉取的镜像 Stage 2&#xff1a;创建实例并启动 A&#xff1a;mysql&#xff08;5.7版&#xff09;…

全栈中VUE的install报错说taobao仓库不好使的解决办法

长话短说&#xff0c;就是报错了&#xff0c;直接上干货。 step1&#xff1a;查看设置&#xff0c;主要是看registry npm config getstep2&#xff1a;设置仓库 npm config set registry https://registry.npmmirror.comstep3&#xff1a;再运行步骤一的指令查看仓库是不是变…

语义分割——高分卫星土地覆盖数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑网络重构和应急资源的灾后配电网信息物理系统协调恢复方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【数据结构】队列的实现(链式)

文章目录 队列1.队列的概念及结构概念结构 2.队列的实现&#xff08;链式结构&#xff09;队列定义初始化队列入队出队获取队头元素获取队尾元素销毁队列判断队列是否为空队列有效个数 完整代码&#xff08;包含测试代码&#xff09;Queue.hQueue.ctest.c 队列 1.队列的概念及…

(毫米波雷达数据处理中的)聚类算法(2) – DBSCAN算法及其实践

说明 读者在阅读本文前&#xff0c;建议先看看本系列的第一篇文章&#xff1a;[1]&#xff08;毫米波雷达数据处理中的&#xff09;聚类算法(1) --- 概述-CSDN博客 DBSCAN算法(Density-Based Spatial Clustering of Applications With Noise)是一种基于密度的聚类算法&#xff…

程序设计:控制台输出二叉树 二叉树的形象显示

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 本文指导你编写一个输出到字符…

lerna实战(一)

前言 将大型代码仓库分割成多个独立版本化的 软件包&#xff08;package&#xff09;对于代码共享来说非常有用。但是&#xff0c;如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪&#xff0c;并且&#xff0c; 跨越多个代码仓库的测试将迅速变得非常复杂。 …