夏夜、

心若平似镜、何题不AC。

2013年8月16日

hdu 3415 单调队列

摘要: sum[i]为前缀和对于以i结尾的一段满足要求的最大和则为x=sum[i]-sum[j-1],i-j+1#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;typedef pair pii;#define pb(a) push_back(a)#define INF 0x1f1f1f1f#define lson idx T min(const T& a, 阅读全文

posted @ 2013-08-16 10:27 BMan、 阅读(192) 评论(0) 推荐(0) 编辑

2013年8月14日

POJ 3368 Frequent values 线段树区间合并

摘要: 题意O(-1)不用解释。。线段树结点维护三个信息:区间内相同的数出现最多的次数maxc、区间左边第一个数出现的次数lc、区间右边第一个数出现的次数rc。分左区间右端点和右区间左端点相同于否的情况合并区间,注意lc或rc为区间长度的情况。 //#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include#include#include#include#include#include#includeus 阅读全文

posted @ 2013-08-14 13:54 BMan、 阅读(225) 评论(0) 推荐(0) 编辑

UVA 11795 Mega Man's Mission 状态DP

摘要: 状态DP,设S为当前已经获得的武器的集合,预处理全部S能攻击的集合g[S]。后面的状态转移就是dp[st]=sum{dp[st^(1<<i)] | i为st的元素,且i为个g[st^(1<<i)]的元素}ll dp[1<<16];int g[1<<16];int n;int p[20];int read(){ char s[20][20]; scanf("%d",&n); for(int i=0;i<=n;i++) scanf("%s",s[i]); for(int i=0;i<=n;i 阅读全文

posted @ 2013-08-14 11:01 BMan、 阅读(202) 评论(0) 推荐(0) 编辑

2013年8月11日

UVA 11552 Fewest Flops DP

摘要: 题意:给一个正整数k和字符串s,s的长度是k的倍数,把s每k个字符分成一组,没组之间的字符可以任意重排,但组与组之间的顺序保持不变。任务是让重排后的新字符串s'的块最少,连续相同的字符组成一个块,比如abbbaa有三个块a、bbb、aa。首先每一组子串中相同的字符肯定要放在一起,然后问题就变成怎么排列这些子串中的块。用dp[i][fa]表示前i组且第i+1组的最左边的字符是fa+'a'的状态能得到的最少的块数那么状态的转移就是两层循环枚举这个第i组最左边和最右边应该放上什么字符,如果最右边和前一组的最左边一样,那么总块数就是加上(X-1)否则加上X,X表示这一组中字符的 阅读全文

posted @ 2013-08-11 09:39 BMan、 阅读(571) 评论(0) 推荐(0) 编辑

2013年8月10日

UVA 10534 Wavio Sequence DP LIS

摘要: 题意:求一个波浪子序列,就是是前一半是上升子序列,后一半是下降子序列(子序列的长度必须为奇数)。分别从左右两个方向求LIS,然后在统计最大值就行了 //#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;typede 阅读全文

posted @ 2013-08-10 17:20 BMan、 阅读(204) 评论(0) 推荐(0) 编辑

UVA 1424 \ uvalive 4256 Salesmen 简单DP

摘要: 题意:给一个无向连通图,和一个长度为L的序列。任务是修改序列上的某些数使得每相邻两个数相等或在图上是两个相邻的点。最少需要修改几个数?用dp[n][fa]表示当第n+1个数是fa时前n个数最少要修改几次用邻接矩阵存图,补上g[i][i]=1;g[0][i]=1;就可以不用分别考虑相等和初始的状态了dp[n][fa]=min{dp[n-1][v]+(v==an?0:1) | g[fa][v]==1}int g[110][110];int da[210];int dp[210][110];int f(int n,int fa,int N){ if(dp[n][fa]>=0)return dp 阅读全文

posted @ 2013-08-10 16:43 BMan、 阅读(367) 评论(0) 推荐(0) 编辑

UVA 1099 \uvalive 4794 Sharing Chocolate 状态DP

摘要: 题意:是否能经过若干次切割把一块x*y的长方形巧克力分成n块,每块是a1,a2,a3...an小块st表示{a1,a2,...an}的某个子集。先预处理出全部sum[st],各个子集的小块总数dp[l][st]表示长为l,宽为sum[st]/l的长方形能否被分成子集st.因为面积必须相等才有可能具体的状态转移看代码int da[16];int sum[10) { if(k%2==1) { sum[st]+=da[bit]; } k/=2;bit++; ... 阅读全文

posted @ 2013-08-10 14:50 BMan、 阅读(307) 评论(0) 推荐(0) 编辑

UVA 1169\uvalive 3983 Robotruck 单调队列优化DP

摘要: 题意:有n个垃圾,坐标为(xi,yi)重量为wi。有一个机器人,要按照编号从小到大的顺序捡起所有垃圾并扔进垃圾桶(坐标(0,0))。机器人可以捡起几个垃圾以后一起扔掉,但任何时候其手中的垃圾总重量不能超过C.两点间的行走距离为曼哈顿距离。求出机器人行走的最短距离。设dp[i]为机器人清理完前i个垃圾所走的最短路程,则,dp[i]=min{dp[j]+dist(0,j+1)+dist(j+1,j+2)+dist(j+2,j+3)...+dist(i-1,i) + dist(i,0) | jfront&&totalw[i]-totalw[q[front]]>c)front++ 阅读全文

posted @ 2013-08-10 13:18 BMan、 阅读(285) 评论(0) 推荐(0) 编辑

UVA 10859 Placing Lampposts 树形DP

摘要: 题意:给一个n个点m条边的无向无环图,再尽量少的结点上放上灯,使得所有边都被照亮(每个灯会照亮所有与它相连的边)在灯的总数最小的前提下,被两盏灯照亮的边尽量大。优化条件有两个:灯的数量a最少,被两灯照亮的边数b最大,因为边的总数是一定的,不是被一个灯照亮就是被两个灯照亮所以第二个条件可用"被一个灯照亮的边数c最小"代替设x=a*M+c;M是一个足够大的常数那么优化条件就变成只有x尽量小了,决定x大小的主要是a的值,在a的值相同的情况下才考虑c的值最终求到x后,a=x/M,c=x%M,b=m-c;dp[i][j]表示以结点i为跟的子树的最优解,j为父节点的放灯状态,j=0表示 阅读全文

posted @ 2013-08-10 11:51 BMan、 阅读(210) 评论(0) 推荐(0) 编辑

UVA 11825 Hackers' Crackdown 状态DP

摘要: 题意:有一个由编号0~n-1的n台计算机组成的网络,一共有n种服务,每台计算机上都运行着全部服务,对于每台计算机,你可以选择停止一项服务,这个行为会导致与这台计算机和与他相连的其他计算机上的这项服务都停止(原来已经停止的继续保持停止状态)。求最多能使多少个服务瘫痪(即没有任何一台计算机在运行这项服务)。首先是一个枚举子集的技巧for(int sub=S;sub>0;sub=(sub-1)&S)问题抽象成数学模型就是:把n个集合p[i],00;sub=(sub-1)&st)if(c[sub]==total) { dp[st]=max(dp[st... 阅读全文

posted @ 2013-08-10 11:09 BMan、 阅读(280) 评论(0) 推荐(0) 编辑

导航