uva
文章平均质量分 71
角落里的阳光Lee
这个作者很懒,什么都没留下…
展开
-
UVALive 3882 And Then There Was One
经典约瑟夫环问题,n个数排成一圈,第一次删m,以后每k个数删一次,求最后留下的数。 为了处理方便,我们约定n个人的编号为0~n-1,最后答案+1就好,先不考虑m,设f[ n ]为这n个人最后留下的编号,那么f[ n ] =( f[ n-1 ] + k)%n+,f[ 1 ] = 0。根据这个递推式,一直推到n-1,第一个数我们是删m,因此答案 f[ n ] = (f[ n-1 ] + m)%n原创 2013-08-09 16:09:21 · 676 阅读 · 0 评论 -
UVALive 2031 Dance Dance Revolution
简单dp。。。 dp[s][l][r] l表示左脚所在位置,r表示右脚所在位置 的 最小消耗。。 #include #include #include #include #include #include using namespace std; #define clr(a,b) memset((a),b,sizeof(a)) const int ma原创 2013-08-11 20:17:16 · 502 阅读 · 0 评论 -
UVALive 2038 Strategic game
一棵树,n个节点,最少需要在节点上放几个士兵,能够观察到所有的边(即一条边上至少一个点选中) dp[ u ][ j ] 表示节点u,状态为j时的把以u为根节点的子树的边全部观察的最小值,j==0表示u节点不放兵,1表示放兵,那么dp[ i ][ 0 ] = sigma(dp[ v ][ 1 ]),d[ u ][ 1 ] = sigma(min(dp[ v ][ 0 ],dp[ v ][ 1原创 2013-08-11 19:22:15 · 508 阅读 · 0 评论 -
UVA 10817 Headmaster's Headache
状态压缩dp,用两位二进制来表示一门课的信息。 code: #include #include #include #include #include using namespace std; #define clr(a,b) memset((a),b,sizeof(a)) const int maxn = 10010; typedef long long lld;原创 2013-08-11 17:28:56 · 536 阅读 · 0 评论 -
UVALive 3530 Martian Mining
一个n*m的矩形,每个点有两种矿,A矿往W方向,B矿往N方向,每个格子上建两种运送带,一种方向是w的,一种是n的,要求一个格子最多只能有一种带,而且传送带不能断,之后能运到边界才算有效,而且不能曲折,求收集到的A,B总量最大 设dp[ i ][ j ] 为前i行,前j列的最大和,每个格子只可能有一种方向的传送带,要么横,要么竖,那么dp[i][j]=max(dp[i-1][j]+sumr[i原创 2013-08-10 18:32:15 · 670 阅读 · 0 评论 -
UVA 11795 Mega Man's Mission
洛克人最初有一把武器,可以杀死某些机器人,每杀死一个机器人,就可以获得他的武器,每个武器可以杀死某些特定的机器人,计算出杀死这些所有的机器人顺序总数? 简单状态压缩DP。dp[ S ] 表示杀死机器人状态为S(1表示死,0活着)的总方案数,先预处理出对于每个S,所获得的武器能够杀死哪些机器人。1表示可杀,0不可以。状态转移方程dp[S] += dp[S0]; 其中 S0为S的子集 即S原创 2013-08-10 16:26:43 · 585 阅读 · 0 评论 -
uva 10859 Placing Lampposts 树形dp
#include #include #include #include #include #include #include #include using namespace std; #define clr(a, x) memset(a, x, sizeof(a)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #def原创 2013-08-02 16:41:17 · 592 阅读 · 0 评论 -
UVA 1099 Sharing Chocolate
#include #include #include #include #include #include #include #include using namespace std; #define clr(a, x) memset(a, x, sizeof(a)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #def原创 2013-08-03 12:16:23 · 1013 阅读 · 0 评论 -
uva 11584 Partitioning by Palindromes dp入门题
dp[i]表示前i个最少构成几个回文 所以转移方程为 如果(j-i)是一个回文 则 dp[i]=min(dp[i],dp[j-1]+1) (j #include #include #include #include #include #include #include #include using namespace std; #define原创 2013-08-03 16:54:54 · 717 阅读 · 0 评论 -
UVA 1424 Salesmen dp入门题
题目大意:给你一个无向联通图,在给你一个序列,要求你把它转换成另一个序列,该序列相邻两点的值要么图上是联通的,要么是相同的,要求修改的点数最小。 设dp[ i ][ j ] 表示从1到第i个位置,以数字 j 为结尾的最小修改点数,那么状态转移方程为:if(j==a[i]) dp[i][j]=min(dp[i][j],dp[i-1][k]); else dp[i][j]原创 2013-08-03 17:02:41 · 900 阅读 · 0 评论 -
UVA 1169 Robotruck
dp[i] 表示从原点出发,将前i个垃圾处理的最小距离 dis[i] 表示从原点一直到第i个的总距离 所以 dis[i]-dis[j+1] 表示从第就j+1 到 i 的距离 odis[i] 表示第i个到原点的距离,w[i] 表示前i个的质量之和 dp[i]= min(dp[j]+odis[j+1]+dis[i]-dis[j+1]+odis[i] ) j 令cal( j原创 2013-08-03 12:39:23 · 821 阅读 · 0 评论 -
uva 11552 Fewest Flops
题目大意:给你一个字符串,要你按每组k个按照顺序进行分组,每组里的字母顺序任意,然后再按照组的顺序拼起来,如果相邻的几个相同的字母算一个块,拼起来后,最少的块是多少? 所以要最小每组相同字母肯定在一起,所以每组枚举结尾字母即可,dp[i][j] 表示 第i组 字母j 结尾 的最小值 如果第i组结尾和第i-1组结尾字母相同 如果 i组的 size==1 则 相等 否则 dp原创 2013-08-03 16:38:06 · 630 阅读 · 0 评论 -
UVA 10534 Wavio Sequence
题意:给你一个序列,求一个最长波浪子序列(不一定连续),满足长度为奇数2k+1 它满足前k+1个是严格递增的,后k+1是严格递减的,即相邻两个数不能相同,输出最大长度。 可以转化为经典的LIS问题,预先用O(nlogn)处理出dp1[ i ],dp2[ i ] ,dp1[ i ] 为以第i个数尾的最长递增序列长度,dp2[ i ] 为以i为开头,到n的最长递减序列长度 那么ans = max原创 2013-08-03 17:14:37 · 668 阅读 · 0 评论 -
poj 3809 UVaLive 4643 Twenty Questions
#include #include #include #include #include #include #include #include #include using namespace std; #define clr(a, x) memset(a, x, sizeof(a)) #define rep(i, n) for (int i = 0; i < (int)(n);原创 2013-08-03 20:35:52 · 980 阅读 · 0 评论 -
UVA 11404 Palindromic Subsequence
逆序后求LCS,然后找出i+j == len情况的最长最小的LCS(子序列在1~i中出现,且其逆序列在i+1到len中出现,对应于回文串偶数情况), (i+j == len-1情况的最长最小的LCS+str[i+1])(子序列在1~i 中出现,且其逆序在i+2到len中出现,注意其中包括子序列为空的情况,即回文串中只有一个字符,对应于回文串奇数情况),从这俩种情况中找出最优解 #incl原创 2013-08-08 10:29:37 · 533 阅读 · 0 评论 -
UVALive 4731 Cellular Network
把n个数分成w组,每个组的值为这个组加上前面所有组的数字个数之和*这个组的概率之和,要使所有的这些组的和最小。 因为每个组的概率之和前面要乘系数,而且是越早选越小,那么我们把所有数字按照从大到小排序,但由于一个组加进去数字如果过多,它前面的系数也会变大,使前面那些大数去乘一个比较大的系数,这里就需要DP一下。设dp[ i ][ j ] 表示前i个数分成j个组能获得的最小值, 状态转移方原创 2013-08-09 15:49:21 · 856 阅读 · 0 评论 -
UVA 10635 Prince and Princess
一开始用滚动数组写了个N^2 的LCS 果断TLE了。 由于每个序列的元素都是互不相同的,所以将A序列重新编号,1-p,然后根据这个编号,对B也重新编号,那么实际上A和B的LCS问题就转化为求B的LIS,复杂度是O(NlogN) #include #include #include #include #include #include #in原创 2013-08-09 16:01:48 · 474 阅读 · 0 评论 -
UVA 10564 Paths through the Hourglass
一个由格子组成的沙漏,输出从上往下的路径中 和为s 的方案数,如果路径数大于0,输出起点编号最小对路径中字典序最小对方案。 从底下直接一遍DP上来,中间分成两段,状态转移方程稍微有点不一样,设d[ i ][ j ][ k ] 表示从最后一行往上到i行j列得到值为k的数量, 路径的话 从上往下枚举,如果L可行 输出L,否则输出R 这样一层层下去就行。 #inclu原创 2013-08-11 14:48:04 · 558 阅读 · 0 评论