04 2012 档案
UVA 10617 - Again Palindrome
摘要:这道题因为那个score out给我蒙住了,其实说白了,就是给你一串字符串,让你从中找出有多少回文字串,这个回文字串可以是一个字母,也可以是多个。既然是动态规划题:我们肯定要这样想,让我们求长度为len的字符串有多少回文字串,那么长度为len-1的字符串有多少回文子串呢,如果我们求出了len-1的字符串,那么长度为len的字符串的回文字串的个数可不可以通过这个来求出呢,那么长度为len-1的母串可不可以通过len-2的母串求出呢,。。。。。当然上面的过程当然是可以的:接下来想一个串如果两端不等的话(ABBO):那么它的方式就等于 1 + ABB里面的种数 + BBO里面的种数 – 两个集合重复 阅读全文
posted @ 2012-04-26 22:37 BFP 阅读(555) 评论(0) 推荐(0) 编辑
UVA 10271 - Chopsticks
摘要:大意:在中国,众通常用一双筷子吃饭。但是L先生与众不同:他用三支筷子吃饭。其中的一支长筷子用来叉取大块的食物,而剩下两支用作普通筷子。两支普通筷子的长度应尽可能的接近,而长的那支只要是三支中最长的就可以了。对于一幅筷子的长度A,B,C(A≤B≤C),定义函数(A-B)2为这副筷子的“难用度”。L先生邀请K个人参加他的生日聚会,并且想将他用筷子的方法介绍给其他人。他需要准备K+8副这样的筷子(给他自己、妻子、儿子、女儿、父亲、母亲、岳父、岳母以及K名客人)。但是L先生的筷子有很多不同的长度!给出所有筷子的长度,他需要找到一种组合K+8副筷子的方法,使得难用度的总和最小。这道题我们先降序排序,然后 阅读全文
posted @ 2012-04-25 00:13 BFP 阅读(330) 评论(0) 推荐(0) 编辑
UVA 10304 - Optimal Binary Search Tree
摘要:这道题以二叉搜索树为背景,有点像最优矩阵链乘的问题:设f[i][j] 表示元素i到元素j的最优解,设k为i到j元素所形成二叉树的根,则有f[i][j] = min{f[i][k-1]+f[k+1][j]+sum[i][j]-a[k]},这里sum[i][j]为i到j的查找频率之和,a[k]为root的查找频率,因此我们要求所有元素的前缀和,为什么要加sum[i][j]-a[k];因为我们每加一层,相当于加了sum[i][j]-a[k];代码如下;#include<stdio.h>#include<string.h>#define MAXN 260#define INF 阅读全文
posted @ 2012-04-23 14:29 BFP 阅读(387) 评论(0) 推荐(0) 编辑
UVA 10739 - String to Palindrome
摘要:由于添加字母和删除字母的效果是一样的,因此我们这里就只进行删除和替换操作。用f【i】【j】表示将第i到j之间的字串变成回文串的最小操作步数,然后转移方程为当s【i】!=s【j】时,f【i】【j】 = min( f【i+1】【j】 ,f【i】【j-1】,f【i+1】【j-1】)+1;当相等时f【i】【j】 =f【i+1】【j-1】;递归操作更方便;#include<stdio.h>#include<string.h>#define MAXN 1010#define INF 0x7fffffffchar s[MAXN];int n, f[MAXN][MAXN];int dp 阅读全文
posted @ 2012-04-18 22:16 BFP 阅读(218) 评论(0) 推荐(0) 编辑
UVA 10306 - e-Coins
摘要:这道题考察的是这样的一个问题,在m行的第一列中找一些数,计算它们之和的平方,然后再计算对应的第二列中的那些数的和的平方,这两个数之和为s2就可以了。这里我借鉴了二维费用的背包问题,易于理解,速度还可以。代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 45int n, m, s;int a[MAXN][2], f[310][310], x[310], y[310];void solve(){ int p = 0; int min = 0x7fffffff; for(i 阅读全文
posted @ 2012-04-18 15:48 BFP 阅读(320) 评论(0) 推荐(0) 编辑
UVA 590 - Always on the run
摘要:第一次把题意理解错了,第二次因为一个 ] ,wrong了四次,还好在极值样例的检测下,找出来了。以后打代码一定要注意了。我是这样定义状态的,f[i][j]表示在第i天时,在城市j所花费的最小费用,很简单的dp题:代码如下:#include<stdio.h>#include<string.h>#define INF 2000000000long long b[15][15][35];long long f[1010][15];int n, k, num;void output(){ if(f[k+1][n] < INF)printf("The best f 阅读全文
posted @ 2012-04-11 16:55 BFP 阅读(396) 评论(0) 推荐(0) 编辑
CSU 1248: 非变性聚丙烯酰胺凝胶电泳
摘要:动规题,方法很巧。很像背包问题,这道题我们可以想成给了空间M,让你求价值之和与M的差最小的那个和,如果超过了M的某个和与小于M的某个和与M之差相等,取小的那个,而我们的方法是将背包空间扩充两倍,初始化f[0][0] = 1;f[i][0] = 0;我们利用01背包的知识求出2M空间的所有值,然后从f[N][j]中以M为中心向两边找,找到第一个为1的f[N][j](如果两边相等取小的),即为所求。(从整个空间开始不断的减少(增加)空间,看最近的哪一个恰好能够装满)。代码如下:#include<stdio.h>#define MAXN 2010int f[MAXN][MAXN], A[ 阅读全文
posted @ 2012-04-10 00:45 BFP 阅读(321) 评论(0) 推荐(0) 编辑
UVA 10651 - Pebble Solitaire
摘要:这道题是模仿别人的bfs,却也有所收获。把12个棋位的有无棋子整体看作一个状态,然后宽搜就可以了。代码如下:#include<stdio.h>#include<string.h>#define MAXN 11000char b[20];int q[MAXN], hash[MAXN], d[MAXN];int N, n;void solve(){ int x,i; int front = 0, rear = 0; memset(hash,0,sizeof(hash)); hash[q[rear]] = 1; d[rear] = 0; rear ++; w... 阅读全文
posted @ 2012-04-06 20:50 BFP 阅读(314) 评论(0) 推荐(0) 编辑
CSU 1080: A simple maze
摘要:典型的bfs。代码如下:#define MAXN 55#define INF 0x7fffffff#include<stdio.h>#include<string.h>int T, N, M, Sr,Sc,Er,Ec, min;char s[MAXN][MAXN], vis[MAXN][MAXN];int q[MAXN*MAXN], dis[MAXN][MAXN];int dx[4] = {0,0,-1,1};int dy[4] = {1,-1,0,0};void solve(int x, int y){ min = INF; memset(vis,0,sizeof(v 阅读全文
posted @ 2012-04-05 23:35 BFP 阅读(224) 评论(0) 推荐(0) 编辑


点击右上角即可分享
微信分享提示