UVA 10154 - Weights and Measures
摘要:这题对我来说有些难,参考了学长的代码,所以让我写“我的思路”肯定会心虚的,就把原文地址贴过来了。核心思想是用f[i]表示能叠 i 层时最轻的总重量,每次扫描的时候都会更新f[i]。这是原文:http://www.cnblogs.com/staginner/archive/2011/11/30/2268497.html代码自己改了一下,本来想把qsort改成sort的,但是毕竟很久没接触qsort了,就没做太大的改动,当作复习qsort。 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h&
阅读全文
UVA 620 - Cellular Structure
摘要:感觉这题很雷人,实在不知道和DP有什么关系。上网一搜,基本都是英文思路,我就稍微翻译一下:Simple : 字符串为“A”Fully-Grown : 字符串结尾为“AB”Mutagenic : 字符串开头为‘B’ 结尾为‘A’Mutant : 其他的感觉天雷滚滚啊,这个好像水题,是汝佳大叔的疏忽吗?代码是改的,老是抄也不好。 1 #include<stdio.h> 2 #include<string.h> 3 const char ans[4][20] = { "MUTANT","SIMPLE", "FULLY-GROW
阅读全文
UVA 437 - The Tower of Babylon
摘要:有些类似“叠箱子”问题,看起来一种砖有无限多个,其实最多只能用到两次。说下我的思路吧,一块砖有3个数据,虽然3!=6,但本质上还是只有3种,把这三种都表示出来,使x<=y;这样就有了3n组数据。因为我不会建图,就把这3n组数据再排列一下,使一块砖只能放到它后面的砖之上,而绝不能放到之前的砖上,即按x为一级y为二级升序排列,结合之前的x<=y,就能达到目的了。比如:两块砖,31*41*59和26*53*58,经过排序后变为:26 53 5826 58 5331 41 5931 59 4141 59 3153 58 26接下来就是DP了……这题我做得很坎坷,因为想用sort不用qsor
阅读全文
UVA 10404 - Bachet's Game
摘要:这题和博弈有关。dp[]储存结果,0表示后取胜,1表示先取胜,而dp[i]取决于它的“前驱”。举个例子吧,可取的石子数为1,3,8,则19的前驱为18、16、11,如果这个状态都为1,那么19的状态为0;只要有一个为0,19的状态就是1。其实我写的代码是有问题的,可能会导致溢出,可是A了,说明UVA的测试数据还不够大吧。 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 1000005 4 bool dp[MAXN]; 5 int a[12]; 6 int main() 7 { 8 int n,m,i,j
阅读全文
poj 2752 - Seek the Name, Seek the Fame
摘要:还是KMP,我觉得应该把自己的心得写一下。这题要求的是“前后辍”,即既是前辍又是后辍,比如“abcab”中的“ab”。KMP求next数组有两种算法,一种是:if(t[i] == t[j]){ i++; j++; next[i] = j; }另一种是:if(t[i] == t[j]){ i++; j++; if(t[i] != t[j]) next[i] = j; else next[i] = next[j];}第二种是第一种的改进版,不过这一题恰恰是第一种比较合适。对字串“ababcabab”来说,两种方法构造的next分另为:ababcabab-10-102-10-104-...
阅读全文
poj 2406 - Power Strings
摘要:还是KMP算法,有些借鉴,但是更好地理解了这种写法。 1 #include <stdio.h> 2 #include <string.h> 3 int next[1000005]; 4 char T[1000005]; 5 int main() 6 { 7 int i,j,len; 8 while(scanf("%s",T)) 9 {10 if(!strcmp(T,"."))11 break;12 i=0;j=-1;13 len = strlen(T);14 next[0] = -1...
阅读全文
poj 3461 - Oulipo
摘要:KMP算法,按书上说的写一遍,总是很别扭,后来才知道是数组开始问题,就是从“1”还是从“0”开始,废了很多脑力,又增几多白发,才把书上的从1开始改为从0开始。昨天我一直熬到半夜也找不到问题在哪儿,今天一下就过了,可见坚持还是有好处的。 1 #include <stdio.h> 2 #include <string.h> 3 int next[10005]; 4 char T[10005],S[1000005]; 5 void getnext(char *t) 6 { 7 int i=0,j=-1,l = strlen(t); 8 next[0] = -1; 9 whil
阅读全文
poj 3006 - Dirichlet's Theorem on Arithmetic Progressions
摘要:就是素数筛选,简单题。最近抄了这么多,终于有一个自己写的了,内牛满面。 1 #include <stdio.h> 2 #include <string.h> 3 bool prime[1000005]; 4 int main() 5 { 6 int i,j,a,d,n,cnt; 7 memset(prime,1,sizeof(prime)); 8 prime[1] = 0; 9 for(i = 2; i < 1000; i++)10 if(prime[i])11 for(j = i*i; j <=1000000; j +=...
阅读全文
ZOJ 2061 - Buy the Ticket
摘要:典型的高精度题,本着“和平共处五项原则”,我抄了一下ZXPN的代码,不过略加改进,中间也出了点问题,忘了算fac[0]了。 1 #include<stdio.h> 2 #include<string.h> 3 char dp[105][105][500],fac[105][200]; 4 void add(char *s1,char *s2,char *s3) 5 {//s3 = s1 + s2 6 int len1 = strlen(s1); 7 int len2 = strlen(s2); 8 int a[10000]; 9 int k =...
阅读全文