SGU 183.Painting the balls

时间限制: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;
}

  

时间: 2024-12-29 23:15:22

SGU 183.Painting the balls的相关文章

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 <

sgu100~199题解

老东西了..发上来吧.. Sgu题解系列  南开中学邹事成 100:A+B略 101:Domino 给n块多米诺骨牌,每张骨牌两端各有从1到6的一个数字,现在要把这些骨牌排成一列,使相邻的两块骨牌相对的面所写的数字一样. 可以把每一块多米诺骨牌想象成一条边,把面上写的数字抽象成点,比如一块骨牌正面写的1反面写的2就想象成连了一条从1到2的边,那么这就是求一条有重边的欧拉回路了,dfs一下即可. 102:Coprimes给定n求从1到n中与n互质的数的个数. 可以把n质因数分解后直接代入欧拉函数.

Soj题目分类

-----------------------------最优化问题------------------------------------- ----------------------常规动态规划  SOJ1162 I-Keyboard  SOJ1685 Chopsticks SOJ1679 Gangsters SOJ2096 Maximum Submatrix  SOJ2111 littleken bg SOJ2142 Cow Exhibition  SOJ2505 The County

待刷题目分类

各大OJ题目归类 Posted on 2012 年 8 月 8 日 by admin ---------–最优化问题------------- --------动态规划 SOJ1162 I-Keyboard SOJ2096 Maximum Submatrix SOJ2111 littleken bg SOJ2505 The County Fair SOJ2818 QQ音速 SOJ2469 Exploring Pyramids SOJ1833 Base Numbers SOJ2009 Zeros

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

之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同颜色的小球进行碰撞 2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数 3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数 4.玩家可以通过键盘的方向键:上,右键进行对小球加速 5.玩家可以通过键盘的方向键:下,左键进行对小球减速 6.玩家可以按键盘:f键实现全屏显示 7.玩家可以按键盘:Esc

SGU 126

简单的BFS.无需任何优化. 利用一个结构体数组储存状态,三个量a,b,move分别表示A箱,B箱的球数以及移动次数. 注意对特殊情况的处理以及对不可能情况的判定: (1)两数之差为奇数,由题意,假设a<b,则移动球数为a,差的改变量为2a. 又有最终状态的前一步是两箱数目相等,差=0,所以不可能实现. (2)两数之差模4余2,但 初始球数都为偶数. 根据上面,类似地可以推导出不可能. (3)出现和前面相同的情况. - -这个就比较难处理- -数据范围在那里- - 总不能开个VIS[2^31][

HDU 3635 Dragon Balls(并查集)

Dragon Balls Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 64   Accepted Submission(s) : 26 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Five hundred years later

POJ3687Labeling Balls

Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14278   Accepted: 4162 Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that: No two balls share

【SGU 390】Tickets (数位DP)

Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell tickets to the passengers. So no wonder that once upon a time in a faraway galaxy one conductor decided to diversify this occupation. Now this conductor