时间限制: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. 【转】ButterKnife基本使用--不错

    原文网址:http://www.cnblogs.com/mengdd/archive/2015/06/23/4595973.html Butter Knife处理字段和方法绑定. 配置: 用gradl ...

  2. 计算机视觉code与软件

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

  3. Unity-layermask的问题

    using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { priva ...

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

    Number是数字值对应的引用类型 var numberObject=new Number(10); Number也重写了valueof().toLocaleString().和toString()方 ...

  5. 《Numerical Methods》-chaper4-一元非线性方程的解

    在许多生产时间问题中,我们根据已知条件往往会列出一个一元非线性方程,一个最典型的例子就是银行存款的问题,由于其利息需要基于前一年的本息和,因此列出来的方程x的指数往往是高次的.还有物理问题当中一系列用 ...

  6. HDU-1300(基础方程DP-遍历之前所有状态)

    Problem Description In Pearlania everybody is fond of pearls. One company, called The Royal Pearl, p ...

  7. poj 1192最优连通子集(简单树形dp)

    题目链接:http://poj.org/problem?id=1192 #include<cstdio> #include<cstring> #include<iostr ...

  8. 如何将下载好的jar包添加到maven本地仓库

    1.首先在pom.xml中添加 <dependency>    <groupId>org.springframework.security</groupId>    ...

  9. 2016 GDCPC 省赛总结

    大神们说,要多写博客,多总结,于是很久之前就开了博客,可是一篇文章都没有写,太懒也是,没什么时间也是.现在省赛结束了,也是时候好好总结一下了. 本来一开始,三个人对拿铜牌是很有把握的,在比赛一开始A了 ...

  10. 【转】java 文件 读取目录下的所有文件(包括子目录)

    转自:http://www.cnblogs.com/pricks/archive/2009/11/11/1601044.html import java.io.File; import java.io ...