2011年12月2日
摘要: UVA_10911 这个题目关键在于对分组状态的表示,看了别人的解题报告后发现,由于N很小,所以可以用一个整数的二进制来表示分组状态,该位置为1则代表该队员还未分组,状态转移就是枚举分组的策略就可以了。 个人感觉用记忆化搜索应该比较好实现一些。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 70000#define MAXN 20#define INF 1000000000int N;double x[MAXN], y[MAXN], f[MAXD];char b[30];doub 阅读全文
posted @ 2011-12-02 16:44 Staginner 阅读(516) 评论(0) 推荐(0) 编辑
摘要: UVA_11151 状态转移方程为:①b[i]==b[j],f[i][j]=f[i+1][j-1]+(i==j?1:2);②b[i]!=b[j],f[i][j]=max{f[i+1][j],f[i][j-1]}。#include<stdio.h>#include<string.h>#define MAXD 1010int N, f[MAXD][MAXD];char b[MAXD];void solve(){ int i, j, k; gets(b); N = strlen(b); memset(f, 0, sizeof(f)); for(k = 0; k < N; 阅读全文
posted @ 2011-12-02 14:07 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
摘要: UVA_10891 一开始想到了极大极小的思路,但觉得这不就变成极大极小搜索了么,后来便没继续往下想。 看了别人的题解后发现果然就是极大极小的博弈思想,只不过由于搜索过程中状态有限而且有些状态是重复的,因此可以用记忆化搜索来降低复杂度。当然也可以用递推形式的动规来做。 以后有想法了之后一定要敢于去实现自己的想法。 如果设f[i][j]表示面临由i到j这样一个石子序列所能取得的最大值,那么f[i][j]=max{sum[i][j]-f[i][k],sum[i][j]-f[k][j],sum},其中sum[i][j]表示i到j的值的和,f[i][k]中i<=k<j,f[k][j]中i& 阅读全文
posted @ 2011-12-02 13:56 Staginner 阅读(831) 评论(0) 推荐(0) 编辑