洛谷 P1336 最佳课题选择 题解
P1336 最佳课题选择 题解
状态:考虑\(f_{i,j}\)表示前\(i\)种论文里面,一共写了\(j\)篇,的最少花费时间。
转移策略:我们一次考虑每一种论文写多少篇。假设写\(k\)篇,\(k \in [0,j] \cap \mathbb{Z}\) ,有转移方程:
\]
其中
\]
可以做记忆化优化,因为多次访问同一个\(cost(i,k)\)。
初始化:我们考虑选0篇无论怎样花费为0,选0种论文但多于0篇一定是不可能的,花费为Inf,再加上转移中要取min的缘故,我们初始化为:
f_{i,j}=\left\{
\begin{array}{}
0 & ,j=0\\
+ \inf &, j \neq 0\\
\end{array}
\right
.
\end{equation*}
\]
相关变量范围见代码。
最后,我们就可以开滚动数组,或者倒序\(j\)优化掉一维。
代码在文末。
这里和01背包及无限背包做个对比。
01背包的转移选择策略,是一个一个选(同时也是一种一种选,因为一种里面只有一个)。转移方程:
\]
无限背包的转移选择策略,是在一种里面一个个选。转移方程:
\]
可以看到两者细微的差别在,选物品的时候,01背包访问\(i-1\),无限背包访问\(i\),所以可以把其中一个维度压缩掉之后,01反着做,无限正着做。
本题目有两点不同:
第一,本题相当于“选择超过某价值的物品,使得容量需要量最小”,把状态的内外对换了一对。
第二,本题目中,如果选了前面一个,那么后面再选的时候,贡献会不一样,因为时间贡献是幂级的而非线性的。类比到无限背包中就是“选的越多,价值越少”,已经选了多少会影响到后面选的东西。选同一个东西的贡献,在不同情况下不一样。
于是,按照无限背包“一个一个”选的策略,就会涉及到之前的选择情况,我们尝试把第\(i\)种选择数目\(k\)加入到状态中,有
f_{i,j,k(k \leq j)}=\left\{
\begin{array}{}
f_{i,j-1,k-1} - cost(i,k-1) + cost(i,k) & ,k \neq 0\\
min(f_{i-1,j,l}), l \in [0,j] \cap \mathbb{Z} &, k = 0\\
\end{array}
\right
.
\end{equation*}
\]
这样是正确的,但是我们发现大多数的状态被浪费了,因为\(k \neq 0\) 的时候只有一种选择。
还有一种方式是把\(f_{i,j}\)中选择了多少个第i种论文,另存为\(g_{i,j} = k\),于是我们有转移方程(错误的):
f_{i,j}=min\left(
\begin{array}{}
f_{i,j-1} - cost(i,g_{i,j-1}) + cost(i,g_{i,j}), g_{i,j} = g_{i,j-1} + 1 ,\\
f_{i-1,j}, g(i,j) = 0
\end{array}
\right)
\end{equation*}
\]
这个转移方程看上去好像是对的,因为就是按照无限背包的思路改的,但实际上是错误的,提交后只能有10分。因为理论上这种转移方程只能处理线性的\(cost(i,k)\),即\(b_{i} = 1\)或\(b_{i} = 0\)
我们和无限背包进行对比:假设有\(f_{1,1} = 12\),\(f_{1,2} = 24\),\(f_{2,1} = 2\),那么对于无限背包问题,有:
\because f_{2,1} = max(f_{1,1},f_{2,0} + v_{2}) \neq f_{1,1}\\
\therefore f_{2,1} \geq f_{1,1}\\
\therefore f_{2,1} + v_{2} \geq f_{1,1} + v_{2}
\]
因此\(f_{1,1} + v_{2}\)不会影响\(f_{2,1} + v_{2}\)对\(f_{2,2}\)可能的贡献,也就是不可能贡献(被max掉了)。
但是在这个问题中,我们令\(w_{i,k} = cost(i,k) - cost(i,k-1)\),有:
\because f_{2,1} = min(f_{1,1},f_{2,0} + w_{2,2}) \neq f_{1,1}\\
\therefore f_{2,1} \leq f_{1,1}\\
\therefore f_{2,1} + w_{2,2} \quad? \quad f_{1,1} + w_{2,1}
\]
可以发现我们无法判断\(f_{1,1} + w_{2,1}\)对于\(f_{2,2}\)是否有贡献,其根源在于对于同一个\(i\),\(w_{i,k}\)是可能不同的,因此不等式失效,即在这种状态和转移方程下,不满足最优子结构。因此DP失效。
(这也说明,一个可DP的问题是存在“最优子结构”“无后效性”,只有特定的方式去“成立”这些性质才能DP,不是随便搞一搞就一定可以DP的)
也就是说,在无限背包问题中,我们把一个物品拿走,从规模更小的状态中转移,这个物品的贡献是确定的,决定“拿走”这一选择中的最优解,就只能是承接之前的最优解。
然而在这个问题中,如果我们把一个物品拿走,从规模更小的状态中转移时,这个物品的贡献是不确定的,也就是说除了最优解以外,次有解也有可能贡献出更好的结果,因此“最优子结构失效了”。
因此,我们在考虑状态和状态转移方程时,可以灵活更改状态、转移方式和策略、记录信息等等,同时也要按照普适状况考虑转移的合法性和具体转移方法。
标准AC代码:
#include <bits/stdc++.h>
#define N (int)(205)
#define M (int)(25)
using namespace std;
typedef long long LL;
int n,m;
LL f[N];
LL a[M],b[M];
LL p[M][N];
LL cost(int i, int k)
{
if(p[i][k] == -1)
return p[i][k] = a[i] * pow(k,b[i]);
else
return p[i][k];
}
int main()
{
memset(p,-1,sizeof(p));
memset(f,0x7f,sizeof(f));
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= m;i++) cin >> a[i] >> b[i];
f[0] = 0;
for(int i = 1;i <= m;i++)
{
for(int j = n;j >= 1;j--)
{
for(int k = 0;k <= j;k++)
{
f[j] = min(f[j],f[j-k] + cost(i,k));
}
}
}
cout << f[n];
return 0;
}
另一种AC的代码:
#include <bits/stdc++.h>
#define N (int)(205)
#define M (int)(25)
using namespace std;
typedef long long LL;
int n,m;
LL f[M][N][N];
LL a[M],b[M];
LL p[M][N];
LL cost(int i, int k)
{
if(p[i][k] == -1)
return p[i][k] = a[i] * pow(k,b[i]);
else
return p[i][k];
}
int main()
{
memset(p,-1,sizeof(p));
memset(f,0x7f,sizeof(f));
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= m;i++) cin >> a[i] >> b[i];
for(int i = 0;i <= m;i++) f[i][0][0] = 0;
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
for(int l = 0;l <= j;l++)
{
f[i][j][0] = min(f[i][j][0],f[i-1][j][l]);
}
for(int k = 1;k <= j;k++)
{
f[i][j][k] = f[i][j-1][k-1] - cost(i,k-1) + cost(i,k);
}
}
}
LL ans = 1e18;
for(int k = 0;k <= n;k++)
ans = min(ans,f[m][n][k]);
cout << ans;
return 0;
}
洛谷 P1336 最佳课题选择 题解的更多相关文章
- 洛谷 P1336 最佳课题选择
P1336 最佳课题选择 题目提供者 yeszy 标签 动态规划 福建省历届夏令营 传送门 难度 尚无评定 题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课 ...
- P1336 最佳课题选择
P1336 最佳课题选择 题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同 ...
- luogu P1336 最佳课题选择
题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...
- luogu P1336 最佳课题选择 |背包dp
题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 02题解-洛谷 P2395 BBCode转换Markdown 题解
洛谷 P2395 BBCode转换Markdown 题解 题目传送门: here. 一道毒瘤的大模拟,给了你一部分的 BBCode 和 Markdown 语法,叫你转换.如下表: BBCode Mar ...
- 浅谈分治 —— 洛谷P1228 地毯填补问题 题解
如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
随机推荐
- 2022-09-07:给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16] 的最大公约数是 2 。 数组的一个
2022-09-07:给你一个由正整数组成的数组 nums . 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数. 例如,序列 [4,6,16] 的最大公约数是 2 . 数组的一个 ...
- Requested setting LOGGING_CONFIG, but settings are not configured
- Python从零到壹丨详解图像锐化Roberts、Prewitt算子实现边缘检测
摘要:图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础.本章主要介绍Robert算子.Prewitt算子.Sobel算子.Laplacian算子.S ...
- Solon v2.2.17 发布,Java 新的生态型应用开发框架
相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...
- 避坑版-OpenSSH 用户名枚举漏洞(CVE-2018-15473)
介绍: OpenSSH 7.7前存在一个用户名枚举漏洞,通过该漏洞,攻击者可以判断某个用户名是否存在于目标主机中,在复现过程中遇到了很多坑,这里我就把遇到坑和解决方法告诉大家!!! 漏洞环境: 靶机: ...
- Java 世界的法外狂徒:反射
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段.方法.构造函数等)的能力.通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态查找和调用. 虽 ...
- RocketMQ 顺序消费机制
顺序消息是指对于一个指定的 Topic ,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息先消费,后发布的消息后消费. 顺序消息分为分区顺序消息和全局顺序消息. 1.分区顺序消 ...
- Rust中的变量的声明和定义
变量的声明和定义 Rust中合法的标识符(包括变量名.函数名.triat名等)必须由数字.字母.下划线组成,而且不能以数字开头.这个和很多语言都是一样的.Rust将来也会允许其他Unicode字符作为 ...
- JAVA SE基础《一》----JAVA入门
初识Java 1.Java背景知识 java是美国sun公司(Stanford University Network)在1995年推出的一门计算机高级编程语言. Java早期称为Oak(橡树),后期改 ...
- tSNE算法在自然语言处理中的应用:文本降维和可视化
目录 技术原理及概念 t-SNE(Toeplitz-Stochastic Neural Network)是一种常用的文本降维和可视化算法,它的核心思想是将高维文本数据映射到低维空间,同时保持数据的一致 ...