SGU 183 Painting the balls (优化的动态规划)
题意:给n个白球,选其中一些涂为黑色,且给了涂第i个球的花费为ci,要求每m个连续的球中至少有两个黑球,问最小花费是多少?
容易想到一个方程dp[i][j]=min{dp[k][i]}+c[j]
dp[i][j]表示最后上色的两个球分别是第i和第j个球(i<j)时的最优解。
我们从条件每m个连续的球中至少有两个黑球可以得出k的范围j-m<=k<i
如果我们直接按上面这个方程去做的话时间复杂度是O(n*m*m)。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #define ll long long #define mod 113 #define INF 100000000 using namespace std; ]; ][]; int main() { int n,m; scanf("%d%d",&n,&m); ; i<=n; ++i) scanf("%d",&c[i]); memset(dp,0x7f,sizeof(dp)); ; i<=m; ++i) ; j<i; ++j) dp[i%mod][i-j]=c[i]+c[j]; ; i<=n; ++i) ; j<i; ++j) { int minn=INF; for(int k=i-m; k<j&&i-k<=m; ++k) minn=min(minn,dp[j%mod][j-k]); dp[i%mod][i-j]=minn+c[i]; } int ans=INF; ; --i) ; i-j<=m&&j>=n-m+; --j) ans=min(ans,dp[i%mod][i-j]); printf("%d\n",ans); ; }
但如果数据范围再大一点,就不行了。
所以我们需要优化一下转移部分。
对于上面那个方程而言,对于相同i,k的右边界是不变的,左边界随着j的变大的而减小。所以我们可以试着从大到小枚举j,这样k的区间就从小变大了。我们可以利用上一个区间的结果,从而降低转移的时间复杂度。
从另一种角度来阐述:
写一下dp[i][j+1]=min{dp[k][i]}+c[j+1],这里k的范围是j-m+1<=k<i。
我们发现这里k的范围是和dp[i][j]那个方程里面的k的范围是有重合的,准确说是dp[k][i]是有重合的。我们假设g=min{dp[k][i]},(j-m+1<=k<i)。这样求dp[i][j]=min{dp[k][i]}+c[j](j-m<=k<i)时,就变成了dp[i][j]=min{dp[j-m][i],g}+c[j]。这样我们只需要以i为阶段,从大到小枚举j就可以把转移这部分的时间复杂度降维O(1)。
这里的计算只适合j大于m的情况,所以需要预处理m以内的部分:dp[i][j]=c[i]+c[j](1<=i<j<=m)。
最终的答案需要从[n-m+1,n]之间的范围之内枚举。
由于卡内存所以要用滚动数组。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> #define ll long long #define mod 101 using namespace std; ][]; ]; int main() { int n,m; scanf("%d%d",&n,&m); ; i<=n; ++i) scanf("%d",&a[i]); ; i<=m; ++i) ; j<=m; ++j) dp[i][j]=a[i]+a[j]; ; i<=n; ++i) { int minn=0x7fffffff; ,n); j>max(i,m)&&j-i<m; --j) { minn=min(minn,dp[(j-m+mod)%mod][i%mod]); dp[i%mod][j%mod]=minn+a[j]; } } int ans=0x7fffffff; ; --i) ; i-j<m&&j>=n-m+; --j) ans=min(ans,dp[j%mod][i%mod]); printf("%d\n",ans); ; }
参考:http://wenku.baidu.com/view/89bd5f1e650e52ea551898fb.html
SGU 183 Painting the balls (优化的动态规划)的更多相关文章
- sgu 183. Painting the balls 动态规划 难度:3
183. Painting the balls time limit per test: 0.25 sec.memory limit per test: 4096 KB input: standard ...
- SGU 183. Painting the balls( dp )
dp..dp(i, j)表示画两个点为i-j, i的最优答案. dp(i, j) = min{ dp(i-j, k) } + cost[i] (1≤k≤M-j) 令f(i, j) = min{dp(i ...
- SGU 183.Painting the balls
时间限制:0.25s 空间限制:4M 题意: 在n(n<=10000)个球中,给若干个球涂色,每个球涂色的代价为Ci,使得任意连续m(m<=100)个球中有至少两个球被涂了色. Solu ...
- 【Luogu2900】土地征用(斜率优化,动态规划)
[Luogu2900]土地征用(斜率优化,动态规划) 题面 Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块 ...
- 【BZOJ1096】【ZJOI2007】仓库建设(斜率优化,动态规划)
[BZOJ1096][ZJOI2007]仓库建设(斜率优化,动态规划) 题面 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原 ...
- 【BZOJ3675】序列分割(斜率优化,动态规划)
[BZOJ3675]序列分割(斜率优化,动态规划) 题面 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得 ...
- 【BZOJ2684】【CEOI2004】锯木厂选址(斜率优化,动态规划)
[BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种 ...
- 【BZOJ3672】【NOI2014】购票(线段树,斜率优化,动态规划)
[BZOJ3672][NOI2014]购票(线段树,斜率优化,动态规划) 题解 首先考虑\(dp\)的方程,设\(f[i]\)表示\(i\)的最优值 很明显的转移\(f[i]=min(f[j]+(de ...
- 图解Leetcode组合总和系列——回溯(剪枝优化)+动态规划
Leetcode组合总和系列--回溯(剪枝优化)+动态规划 组合总和 I 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...
随机推荐
- VI打开和编辑多个文件的命令 分屏操作
VI打开和编辑多个文件的命令 可分两种情况: 1.在同一窗口中打开多个文件: vi file1 file2 file3:n 切换到下一个文件 (n=next):N 切换到上一个文件 2.在不同窗口 ...
- xcode6 framework missing submodule xxx 警告
xcode6 framework missing submodule xxx 警告 从xcode6开始,iOS可以直接创建生成framework了 如: 创建 framework 项目,TFKit.f ...
- dede调用文章里的图片
{dede:arclist row='6' orderby='pubdate' typeid='5' idlist='' channelid='1'} <li><a href='[f ...
- PRIMARY LANGUAGE ID not a number
用vs2010修改别人的源代码(估计是vc6下的) .RC 文件,报错: 1>.RC(8): error RC2144: PRIMARY LANGUAGE ID not a number 1 ...
- apt-get remove, apt-get autoremove和aptitude remove的区别
这篇文章的图片链接发生了问题,无法正常查看图片,所以我在CSDN转载一下,特此声明. apt-getremove的行为我们很好理解,就是删除某个包的同时,删除依赖于它的包,例如:A依赖于B, B依赖于 ...
- VS2012更改项目编译后文件输出目录
1.现在我的解决方案里有存在两个项目,分别是类库项目ClassLibrary1和控制台项目ConsoleApplication1,默认情况下当解决方案重新生成后,这两个项目所对应的编译后文件分别会存在 ...
- WebGL 入门-WebGL简介与3D图形学
什么是WebGL? WebGL是一项使用JavaScript实现3D绘图的技术,浏览器无需插件支持,Web开发者就能借助系统显卡(GPU)进行编写代码从而呈现3D场景和对象. WebGL基于OpenG ...
- [saiku] 访问saiku首页的时候前后台处理流程
这篇文章讲述:项目启动后,首次访问SAIKU的登录页,前后台分别做了什么处理 (1) 访问的到底是什么页面? 浏览器输入:localhost:8080 啪一回车 根据web访问的尿性,访问的是 ind ...
- Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait().notify().notifyAll()方法进行线程 ...
- nyoj-746
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...