关灯问题 dp
题意是一排路灯,每个路灯有耗电量,照明度,需要给这n个路灯按顺序分组,每组内的最大耗电量是电灯数乘t,可以选择关闭一些电灯,求最大的照明度;
这题思路很明显,预处理出一个g[i][j]表示i到j分为一组的最大照明度,f[i][j]表示前i个分为j组的最大照明度,f[i][j]=max(f[k-1][j-1]+f[k][i]);
朴素的预处理是这么搞的
int h[maxm*maxn];
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++){
memset(h,,sizeof(h));
int s=(j-i+)*t;
for(int k=i;k<=j;k++)
for(int c=s;c>=;c--){
if(c<w[k])break;
h[c]=max(h[c],h[c-w[k]]+v[k]);
}
g[i][j]=g[j][i]=h[s];
}
n^4,无法接受,观察了一下,发现h数组每次都这么清一遍太浪费了,要想想怎么从前面的h中获取信息,发现每次h中有i-j的最优信息,然后处理i-j+1的时候相当于又处理了一遍i-j,要找i-j+1的g值,可以考虑一下不清空h数组,直接从j+1向上搞,但是每次最大耗电量都不一样,直接可以设成i-n的最大耗电,然后每次处理完后,在1-当前最大耗电里找最大值就行了,省了一维,可以通过了;
修改代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
using namespace std;
const int maxn=,maxm=;
int n,m,t,w[maxn],v[maxn];
int g[maxn][maxn],f[maxn][maxm];
void init(){
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<=n;i++)scanf("%d%d",&w[i],&v[i]);
int h[maxn*maxn];
for(int i=;i<=n;i++){
memset(h,,sizeof(h));
int s=(n-i+)*t;
for(int j=i;j<=n;j++){
int S=(j-i+)*t;
for(int c=s;c>=;c--){
if(c<w[j])break;
h[c]=max(h[c],h[c-w[j]]+v[j]);
}
g[i][j]=g[j][i]=h[S];
}
}
}
void work(){
for(int i=;i<=n;i++)
for(int k=;k<=m&&k<=i;k++){
for(int j=k;j<=i;j++){
f[i][k]=max(f[i][k],f[j-][k-]+g[j][i]);
}
}
cout<<f[n][m]<<endl;
}
int main(){
init();
work();
}
关灯问题 dp的更多相关文章
- 状压DP【p2622】 关灯问题II
题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...
- 关灯问题II 状压DP
关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...
- [状压DP]关灯问题II
关 灯 问 题 I I 关灯问题II 关灯问题II 题目描述 现有n盏灯,以及 m m m个按钮.每个按钮可以同时控制这 n n n盏灯--按下了第 i i i个按钮,对于所有的灯都有一个效果.按下i ...
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- [Luogu2622]关灯问题$||$(状压$DP$)
#\(\color{red}{\mathcal{Description}}\) \(Link\) 现有\(n\)盏灯,以及\(m\)个按钮.每个按钮可以同时控制这\(n\)盏灯--按下了第i个按钮,对 ...
- 洛谷 P2622 关灯问题II【状压DP】
传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...
- 洛谷 P2622 关灯问题II(状压DP入门题)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...
- 洛谷P1220关路灯[区间DP]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
随机推荐
- javascript的变量,传值和传址,参数之间关系
先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...
- Java ZK image 處理
自己上 ZK 官方論壇提問.別人的回答.自己解決問題後上傳的問題紀錄: http://forum.zkoss.org/question/101152/how-do-i-binding-image-fi ...
- (转)浅谈HTML5与css3画饼图!
神马系饼图? 饼图,大家都应该熟知,在统计数据对比方面,几乎处处用到.如cnzz的统计饼图 从饼图中,很形象地展示了访问者地区的分布,以扇形为块的方式拼成一个大圆. 都使用什么方法实现 目前众多站点制 ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- 在PyQt中直接使用ui文件并加载qrc资源文件
1. 用Qt设计师创建一个包含qrc资源文件的ui文件 2.打开cmd使用以下命令把qrc资源文件转换成十六进制的py文件 pyrcc4 -o C:\res.py C:\res.qrc pyrcc4 ...
- DevExpress 表中数据导出
gridView1.ExportToXlsx("SampleStock.xlsx"); if (true) { DevExpress.XtraEditors.XtraMessage ...
- 对"使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework"增加说明
http://www.cnblogs.com/basilwang/archive/2011/11/29/2267809.html 想做独立引用的估计都看过这一篇文章,但是因为软件更新,很多地方已经不适 ...
- html中调用silverlight中的方法
在xaml页面中放置一个textblock控件来绑定数据 <ItemsControl x:Name="cityname"> <Items ...
- Linux ls -l内容详解
ls -l是列出当前目录下所有文件信息 以下是实例: 具体的文字描述如下: 第1字段: 文件属性字段文件属性字段总共有10个字母组成,第一个字母表示文件类型,如果这个字母是一个减号”-”,则说明该文 ...
- linux中fork()函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...