【线性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问题中,有着几个比较经典而基础的模 ...
随机推荐
- 手机APP测试如何进行兼容性测试?
Android App兼容性测试是一个比较重要的App评价内容,实际上兼容性测试不仅仅和测试人员相关,在开发阶段就应当着重考虑,因为兼容性问题是除了实现App本身要求的功能后,必须要关注.而且至关重要 ...
- C# 中访问修饰符
1.public 完全公开的,公共的 2. private 私有的,只能在当前类的内部访问, 不可修饰类 3.protected 受保护的,只能在当前类的内部以及其子类中访问,不能用来修饰类 4.in ...
- 骰子涂色 (Cube painting,UVa 253)
题目描述:算法竞赛入门习题4-4 题目思路:1.旋转其中一个骰子进行匹配 2.进行遍历,如果匹配,就进行相对面的匹配 3.三个对立面都匹配即是一样等价的 //没有按照原题的输入输出 #include ...
- 1 wait notify
wait/notify: wait()使线程停止,notify使wait状态的线程继续执行. wait()是Object类的方法,该方法用来将线程置入“预执行队列”,并在wait()方法处停止执行,直 ...
- Executor Framework
Why? look at the following 2 pieces of code for implementing a simple web server based on socket, ca ...
- 【转载】java byte转十六进制
public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b ...
- java键盘IO
public class IO { public static void main(String[] args) throws Throwable { ScannerTest(); // testSc ...
- ArrayList遍历(JAVA)
假如有个ArrayList变量如下: ArrayList<String> list = new ArrayList<String>(); list.add("arra ...
- new关键字 、this关键字、base关键字
使用new,所做的三件事: 1. (类是引用对象,引用对象是在堆中开辟空间)在堆中开辟空间 2. 在开辟的堆空间中创建对象 3. 调用对象的构建函数 4. 隐藏父类成员:子类的成员可以与隐藏从父类继承 ...
- oracle怎样查询索引的使用情况
查询用户的索引select index_name,table_name,tablespace_name, index_type,uniqueness , status from dba_indexes ...