时间限制:0.25s

空间限制:4M

题意:

   在n(n<=10000)个球中,给若干个球涂色,每个球涂色的代价为Ci,使得任意连续m(m<=100)个球中有至少两个球被涂了色.


Solution:

 首先很直接地能想到一个DP的状态转移方程

f[i][j] 代表,当前涂第i个球,且前面最近一个被涂色的球为j的最小代价

f[i][j]=min(f[j][k])+Ci,   k>i+1-m

分析这个转移方程的时间复杂度是O(n*m*m)在此题的数据范围中高达10^8

显然我们需要更好的解法

分析上面的方程发现,在计算min(f[j][k])时,是有重复计算的部分的,

于是想办法减少这个重复的过程。

对于 一个 j,i的范围在 (j+1,j+m-1)

对应k的范围 是(i+1-m+1)~(j-1)

如果我们让i从(j+m-1)倒推至(j+1)

就可以让k从(j-1)变成(i+1-m+1)

min(f[j][k])需要计算的范围就会依次变大,而且可以递推求出

即可以在O(1)的时间里求出min(f[j][k])

总的时间复杂度就变成了O(n*m)

再发现空间上不能直接用n*m的数组,加上滚动数组优化就行了

code

#include <iostream>
#include <cstring>
using namespace std;
const int mod = 101;
int n, m;
int c[10009];
//f[i][j]涂当前第i个球,和第i,第j个球的最小代价
//只保留最近的200个;
int f[200][200];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> c[i];
memset (f, 0x3f, sizeof f);
f[1][0]=c[1];
for (int i = 1; i <= m; i++)
for (int j = 1; j < i; j++)
f[i][j] = c[i] + c[j];
for (int j = 2; j < n; j++) {
int tem = 0x3f3f3f3f;
for (int i = j + m - 1; i > j; i--) {
if(i<=m) break;
tem = min (tem, f[j%mod][(i - m)%mod]);
f[i%mod][j%mod] = tem + c[i];
}
}
int ans = 0x7fffffff;
for (int i = n - m + 1; i <= n; i++)
for (int j = i - 1; i - j < m && n - j < m; j--)
ans = min (ans, f[i % mod][j % mod]);
cout << ans;
return 0;
}

  

SGU 183.Painting the balls的更多相关文章

  1. 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 ...

  2. 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 ...

  3. SGU 183 Painting the balls (优化的动态规划)

    题意:给n个白球,选其中一些涂为黑色,且给了涂第i个球的花费为ci,要求每m个连续的球中至少有两个黑球,问最小花费是多少? 容易想到一个方程dp[i][j]=min{dp[k][i]}+c[j] dp ...

  4. SCU3037 Painting the Balls

    Description Petya puts the \(N\) white balls in a line and now he wants to paint some of them in bla ...

  5. SGU 分类

    http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...

  6. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  7. pygame系列_小球完全弹性碰撞游戏

    之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同 ...

  8. sgu 121. Bridges painting 列举情况 难度:1

    121. Bridges painting time limit per test: 0.25 sec. memory limit per test: 4096 KB New Berland cons ...

  9. Bridges painting - SGU 121(构造)

    题目大意:有个一无向图,给所有的边染色,如果一个点连接的边超过两个,那么最少要染一个白色和一个黑色,能否给整个图染色?不能输出“No solution”. 分析:引用连接 http://edward- ...

随机推荐

  1. app.config应该放哪?

    一:做了一个简单的三层构架的小例子,在主项目里调用工具类的方法实现在数据库里添加一条信息.先看下错误的提示信息是什么样的,如下图一,图二是调用工具类.直接在工具类里写上连接字符串就没问题,如果写到ap ...

  2. 打开本地html的一些设置

    解决:打开本地html,提示:此网站窗口向您索取信息,如果信任此网站,请单击此处允许脚本窗口 工具-internet选项-安全-自定义级别-脚本-允许网站试用脚本窗口提示获取信息 选择启用 工具-In ...

  3. 计算机视觉code与软件

    Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...

  4. JavaScript高级程序设计10.pdf

    String类型有几种操作字符串的方法 concat()方法拼接任意多个字符串,不修改原字符串 var stringValue=“hello ”; var result=stringValue.con ...

  5. lightoj 1036 dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1036 #include <cstdio> #include <cst ...

  6. VShell破解版

    VShell破解版 VShell破解版

  7. 【异构计算】OpenCL中上下文

    引言 opencl中,上下文(context)是一个抽象容器并存在于主机端,它能协调主机与设备之间的交互机制,管理设备上可以的内存对象,跟踪针对每个设备新建kernel和程序. API函数clCrea ...

  8. 自定义使用S缓存方法

    <?php $info=S("name","lizhaoyao"); $name=S("name"); var_dump($name) ...

  9. myeclipse6.0下载及注冊码

    myeclipse6.0 下载地址.官方下载地址: http://www.myeclipseide.com/module-htmlpages-display-pid-4.html 本地快速下载地址: ...

  10. MFC——error LNK2005: "protected: static struct AFX_MSGMAP

    好久没弄VC程序了,今天弄了下,还会用公司给的窗口重绘作为基类来实现,竟然报了这个错误. 找了一下是这里: 有个窗口重绘类是基类: class CBaseDlg : public CDialog 新建 ...