【线性DP】【lgP1336】最佳课题选择
Description
Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择。由于课题数有限,Matrix67不得不重复选择一些课题。完成不同课题的论文所花的时间不同。具体地说,对于某个课题i,若Matrix67计划一共写x篇论文,则完成该课题的论文总共需要花费Ai*x^Bi个单位时间(系数Ai和指数Bi均为正整数)。给定与每一个课题相对应的Ai和Bi的值,请帮助Matrix67计算出如何选择论文的课题使得他可以花费最少的时间完成这n篇论文。
Input
第一行有两个用空格隔开的正整数n和m,分别代表需要完成的论文数和可供选择的课题数。
以下m行每行有两个用空格隔开的正整数。其中,第i行的两个数分别代表与第i个课题相对应的时间系数Ai和指数Bi。
Output
输出完成n篇论文所需要耗费的最少时间。
Sample Input
Sample Output
Hint
对于30%的数据,n<=,m<=; 对于100%的数据,n<=,m<=,Ai<=,Bi<=。
Solution
第一次定义的方程为f[i]表示写前i篇论文的最小花费,发现无法转移。因为a*(x+y)^b显然不等于a*x^b+a*y^b。考虑阶段划分:对于同一种课题的花费,在一个状态中要一次性计算下来,否则就会出现无法转移的情况。由此可将课题种类数作为阶段,设f[i][j]表示用前i个课题写j篇论文的花费。转移显然:f[i][j]=min{f[i-1][k]+a[i]*pow((j-k),b[i])|其中k<j}。显然可以把第一维滚动掉,但是我懒得滚了= =。
对于边界,f[i][0]=0,其中i∈[0,m]
Code
#include<cstdio>
#include<cstring>
#define maxn 205
#define maxm 25
#define ll long long int inline void qr(ll &x) {
char ch=getchar();ll f=;
while(ch>''||ch<'') {
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
x*=f;
return;
} inline ll max(ll a,ll b) {return a>b?a:b;}
inline ll min(ll a,ll b) {return a<b?a:b;} inline void swap(ll &a,ll &b) {
ll c=a;a=b;b=c;return;
} ll n,m,frog[maxn][maxn]; struct Pa {
ll a,b;
};
Pa pa[maxn]; ll pow(ll a,ll b) {
if(!b) return ;
if(!(b^)) return a;
ll t=b/;
ll an=pow(a,t);
if(b%) return an*an*a;
else return an*an;
} int main() {
qr(n);qr(m);
for(int i=;i<=m;++i) {
qr(pa[i].a);qr(pa[i].b);
}
std::memset(frog,0x3f,sizeof frog);frog[][]=;
for(int i=;i<=m;++i) frog[i][]=;
for(int i=;i<=m;++i) {
for(int j=;j<=n;++j) {
for(int k=;k<=j;++k) {
frog[i][j]=min(frog[i][j],frog[i-][j-k]+pa[i].a*pow(k,pa[i].b));
}
}
}
printf("%lld\n",frog[m][n]);
return ;
}
Summary
1、不要闲的没事一上来就压维。发现状态不对容易懵逼
2、在设计状态的时候,一般而言需要在一个状态中需要一次性计算的会被作为阶段进行划分,划分时注意感性领悟一下无后效性原则,不要闷头方程。
3、在不压维状态下若以一个维度为阶段无法转移可以尝试使用另一个维度作为阶段
4、对于看起来需要记录以往信息但又明显不是状压的DP(例如本题若使用论文数作为阶段需要记录对于每一个状态每一个课题选了多少),一般而言会把需要记录的信息作为阶段,目的还是,方便一次性计算。
5、初始化的时候把所有能想到的边界全部初始化掉。别嫌麻烦。不然容易GG。
End on 2018/6/3
【线性DP】【lgP1336】最佳课题选择的更多相关文章
- 洛谷 P1336 最佳课题选择
P1336 最佳课题选择 题目提供者 yeszy 标签 动态规划 福建省历届夏令营 传送门 难度 尚无评定 题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课 ...
- P1336 最佳课题选择
P1336 最佳课题选择 题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同 ...
- luogu P1336 最佳课题选择 |背包dp
题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...
- [codevs1554]最佳课题选择
题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...
- luogu P1336 最佳课题选择
题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...
- RQNOJ 117 最佳课题选择:多重背包
题目链接:https://www.rqnoj.cn/problem/117 题意: NaCN_JDavidQ要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择. 由于课题数有限,NaCN_JD ...
- 洛谷 题解 P1336 【最佳课题选择】
详细解析解题过程 设计状态 dp[i][j]表示前i节课题写j篇论文花费的最少时间 初始数组 for(int i=0;i<=20;i++) for(int j=0;j<=200;j++)d ...
- luogu1336 最佳课题选择
背包问题加强版orz #include<iostream> #include<cstdio> #include<cmath> #include<cstring ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
随机推荐
- JMeter常用元器件
测试计划, 是整个工程的根节点, 可以取别名, 并添加注释, 里面的设置是全局变量: 线程组, 是一组线程的集合, 可以取别名, 并添加注释, 里面的设置只对本线程组有效: HTTP请求, 也就是取样 ...
- selenide 自动化测试进阶一: 查找元素和相关操作
基础环境配置和举例请移步:https://www.cnblogs.com/davice/p/9298742.html 提到自动化有些测试同学就会问,我会使用工具录制做自动化,我会用工具或插件识别元素. ...
- 安装SQLSEVER与MySQL
昨天装了一整填的SQLSEVER,今天是把昨天遗留的问题给重新整合一下,上午安装MySQL的时候,是在网上找的帖子通过压缩包安装的,捣鼓了一上午,下午花不到一个小时, 去安装好了,我觉得通过压缩包安装 ...
- 破解IDEA注册码,设置 license server一直有效不过期
破解的详细过程: 1.从下面地址下载一个jar包,名称是 JetbrainsCrack-2.10-release-enc.jar 下载地址是http://idea.lanyus.com/,进去之后点 ...
- Android Test和Logcat
一 测试相关概念 是否有源码 黑盒测试: 测试工具 白盒测试: 对所有的源码特别熟悉 对特定的代码进行测试 都是编程 时间 单元测试(程序员) 模块测试 集成测试 系统测试 回归测试(改bug) 压力 ...
- TW实习日记:第20-21天
为什么上周五没写呢,因为上周五一直在熟悉业务流程...根本不会写一些复杂的业务代码,因为没有业务流程图!!!在学校的上需求分析和UML建模课的时候,还有软件工程课的时候,想着这都什么鬼啊,听来干嘛,写 ...
- Eclipse 安装SVN、Maven插件
1先安装subeclipse插件就是svn svn - http://subclipse.tigris.org/update_1.6.x 我这里是灰色的说明我安装过了这里只是截图说明下,我就不继续安装 ...
- js实现滑动器效果
最近公司在做一个项目,页面中要用到滑动器效果,我的第一反应是使用HTML5 input类型中的range类型,但马上我就否定了这个想法,因为range类型存在浏览器的兼容性问题(在主流浏览器中).但又 ...
- MFC常用数据类型
下面这些是和Win32程序共同使用的数据类型BOOL:布尔值,取值为TRUE or FALSEBSTR:32-bit 字符指针BYTE:8-bit整数,未带正负号COLORREF:32-bit数值,代 ...
- Java学习个人备忘录之多线程
进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...