【线性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问题中,有着几个比较经典而基础的模 ...
随机推荐
- 微信小程序如何性能测试?
背景: 微信小程序作为手机页面的一种,相比传统的网站和应用来说存在比较特殊的地方: 1. 开发者往往对程序做了限制,只能通过微信客户端访问 2. 通过微信的Oauth进行认证 这样往往会导致我们的 ...
- Jenkis 无法下载插件问题解决
在新机器上安装jenkins后,安装插件报如下错误 sun.security.provider.certpath.SunCertPathBuilderException: unable to find ...
- JMeter自学笔记2-图形界面介绍
一.写在前面的话: 上篇我们已经学会了如何安装JMeter和打开JMeter,那么这篇我们将对JMeter的图形界面做一个简单的介绍.大家只要简单的了解即可,无需死记硬背,在今后的学习和使用中慢慢熟悉 ...
- Python-S9——Day82-CRM项目实战
1.权限的概念: 2.RBAC的设计: 3.注册登录用户所有权限到session中: 4.权限的校验: 5.基于中间件的权限校验: 1.权限的概念: 1.1 项目与应用: Project App 1. ...
- Android intel X86 图像渲染
最近几天有个项目需要在intel 芯片的系统上集成我们的视频通话软件.之前只是在ARM平台上使用,对于intel 没测试过,直接运行apk后,本端渲染的图像出错,渲染出的图像很像I420被作为RGB5 ...
- mysql中的select语句where条件group by ,having , order by,limit的顺序及用法
-- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...
- spark-submit配置说明
<Spark 官方文档>Spark配置 spark-1.6.0 原文地址 Spark配置 Spark有以下三种方式修改配置: Spark properties (Spark属性)可以控制绝 ...
- Memcache的客户端连接系列(一) Java
声明:本文并非原创,转自华为云帮助中心的分布式缓存服务(Memcached)的用户指南. 关键词: Memcached 客户端 Java Java连接池 Java客户端示例 用户的弹性云服务器已安装 ...
- priority_queue(优先队列):排序不去重
C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序. 头文件:#include<queue> 参数:priority_queue<Type, Container ...
- 11.24Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.990 测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.991 测试 王宇杰 负责后台代码测 ...