2011年11月29日
摘要: UVA_11137 这个题目实际上就是一个多重背包问题,只不过要求记录的是方案的种数。#include<stdio.h>#include<string.h>#define MAXD 10010int N;long long int f[MAXD];void solve(){ int i, j, k; memset(f, 0, sizeof(f)); for(i = 0; i <= N; i ++) f[i] = 1; for(i = 2; i <= 21; i ++) { k = i * i * i; for(j = k;... 阅读全文
posted @ 2011-11-29 20:42 Staginner 阅读(197) 评论(0) 推荐(0) 编辑
摘要: UVA_10617 这个题目可以用区间动规去处理。 我们设f[i][j]为字符串i到j这个区间内回文串的个数,那么如果b[i]==b[j],f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+f[i+1][j-1]+1=f[i+1][j]+f[i][j-1]+1,也就是说f[i][j]包括4个部分,第一部分是b[i]和中间的字符形成的回文串,第二部分是b[j]和中间的字符形成的回文串,这两部分也就等于区间[i,j-1]内的回文串的个数加上[i+1,j]内回文串的个数再减去区间[i+1,j-1]内的回文串的个数,也就是f[i+1][j]+f[i][j-1]-f[i.. 阅读全文
posted @ 2011-11-29 20:04 Staginner 阅读(491) 评论(4) 推荐(0) 编辑
摘要: UVA_10271 总的来讲,我们应该从大到小去安排筷子,因为如果从小到大去安排的话,最后剩下的不一定可以作为最长的那根。 我首先将筷子反过来存在了数组a[]里面,这样用f[i][j]表示一共有到第i根这么多的筷子安排给j个人的最小的badness,那么如果3*j==i+1,f[i][j]=f[i-2][j-1]+(a[i–1]–a[i])*(a[i-1]-a[i]),否则f[i][j]=min{f[i][j-1],f[i-2][j-1]+ (a[i–1]–a[i])*(a[i-1]-a[i])},当然3*j<=i+1且j<=K+8。#include<stdio.h># 阅读全文
posted @ 2011-11-29 17:04 Staginner 阅读(366) 评论(4) 推荐(0) 编辑