1. Uva11400 Lighting System Design:
有n种灯泡,不同种灯泡不能共用一个电源,且只能接在比额定低的电源上。给出每种灯泡的电压,电源费用,数量,单价,可以把一种灯泡换成额定更高的另一种灯泡来节约钱,求最优方案的费用。显然,每种电压的灯泡要么不换,要么全换。先将灯泡按照电压升序排序,令sum[i]
为前i种灯泡的总数量,dp[i]为前i种灯泡的最小花费。状态转移方程为: dp[i]=min(dp[j]+(sum[i]-sum[j])*c[i]+k[i]),j
;表示前j种灯泡用最优方案,第j+1个到第i个都用第i种灯泡。#include
#include
#include
#include
#include
#include
#include
2. Uva11584 Partitioning by Palindromes: 给出一个小写字母组成的字符串,问最少能划分成多少个非空回文串。令dp[i]为前i个字符里最小的回文串个数,很容易想到dp[i]=min(dp[j]+1|j+1~i是回文串)。但这样操作的复杂度是O(n^3)。可以先以O(n^2)的复杂度预处理出i~j是否为回文串,这样在用上述方法进行处理的时候就可以将状态转移的时间从O(n)降为O(1),总的复杂度为O(n^2)。#include
#include
#include
#include
#include
#include
#include
3.Uva1625 ACM/ICPC Daejeon2011 Color Length: 给出两个长度为n和m的颜 {MOD}序列,要求按顺序合并成一个序列,定义每种颜 {MOD}的权值为最后出现的位置与首次出现的位置之差,求最小的序列权值。设dp[i][j]为两个数列分别移走i个和j个元素时,还需要多少权值。注意是“还需要多少”,因为本题需要最小化的量比较复杂,某种颜 {MOD}第一次出现时,并不知道什么时候会结束。而它最后一次出现时,也并不知道是什么时候开始的。如果记录每种颜 {MOD}第一次出现位置,状态会变得十分复杂,因此改进计算方法:并不是等到一种颜 {MOD}全部移完之后再计算,而是在中间逐步累加。当把一个颜 {MOD}移动到序列中时,所有“已经出现过但还没有结束”的颜 {MOD}的权值都需要加一,也就是说,我们只需要找出有多少颜 {MOD}已经开始且尚未结束,而不需要知道它们具体是哪些颜 {MOD}。因此,可以先预处理出每种颜 {MOD}在两个序列里初次和最终出现的位置,就可以在状态转移中以O(1)的复杂度计算出dp[i][j]中有多少种颜 {MOD}已经开始但尚未结束。状态转移方程dp[i][j]=min(dp[i+1][j],dp[i][j+1])+cnt[i][j],总的时间复杂度为O(n*m)。#include
#include
#include
#include
#include
#include
#include
4. 翻转括号:给出一个由括号组成的序列,问存在多少个这样的位置,使得只要翻转此处的括号就能使这个序列变成合法序列。将左括号'('视为+1,右括号')'视为-1则序列合法等价于所有前缀和非负且最后为零。求出前缀和后预处理左右的最小值,枚举翻转位置判断可行性即可。#include
#include
#include
#include
#include
#include
#include