夏夜、

心若平似镜、何题不AC。

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、 阅读(208) 评论(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、 阅读(372) 评论(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、 阅读(216) 评论(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、 阅读(294) 评论(0) 推荐(0)

UVA 10891 Game of Sum DP

摘要: 题意:给n个数,A,B两人轮流取,每次可从左右其中一边取1或多个数,两个人都尽量使自己取的数总和最大,问最终sumA-sumB最大为多少。由于两个人取的数总和是一定的,所以只要求出先取的那个最多有多少就行了。用dp[i][j]表示a[i..j]这一段数中先取的人能取到的最大和。(这里的先取意思是表示这在一段先取,不是A的意思)先取的人可能取左边任意一段a[i..i],a[i..i+1],a[i...i+2]....a[i,j]或右边任意一段a[j...j],a[j-1...j],a[j-2..j]....a[i,j]那么另一个人就有可能从a[i+1...j]、a[i+2....j],a[j.. 阅读全文

posted @ 2013-08-10 10:43 BMan、 阅读(171) 评论(0) 推荐(0)

导航