上一页 1 ··· 59 60 61 62 63 64 65 66 67 ··· 85 下一页
  2011年11月28日
摘要: UVA_10304 一开始没有理解二叉搜索树的特点。 这个题目的二叉搜索树的左子树的节点一定比当前节点小,右子树的的节点一定比当前节点大。这样我们对于题目给出的线性表,如果选定了一个根节点,那么根节点左边的一定都是左子树的,右边的一定都是右子树的。就每一个子树来看,也有这样的特点。 于是我们取f[i][j]表示i到j这个子树的最优搜索树的期望,那么f[i][j]=min{f[i][k-1]+f[k+1][j]+sum(i,j)-a[k]},其中a[k]表示访问k节点的频率,sum(i,j)表示i到j的访问频率之和。我们每选定一个相对的根节点,那么相当于原来独立的左右两个子树的层数均增加了... 阅读全文
posted @ 2011-11-28 22:53 Staginner 阅读(766) 评论(0) 推荐(0) 编辑
  2011年11月26日
摘要: UVA_10306 直接将x、y由小到大进行递推即可,对每个格子都尝试一下M个向量加法操作。#include<stdio.h>#include<string.h>#define MAXM 50#define MAXS 310#define INF 1000000000int M, S, x[MAXM], y[MAXM], f[MAXS][MAXS];void init(){ int i; scanf("%d%d", &M, &S); for(i = 0; i < M; i ++) scanf("%d%d", 阅读全文
posted @ 2011-11-26 03:37 Staginner 阅读(307) 评论(0) 推荐(0) 编辑
摘要: UVA_10739 我们用f[i][j]表示字符串从第i位到第j位构成回文串最少所需的操作数,如果b[i]==b[j],f[i][j]=f[i+1][j-1],否则f[i][j]=min{f[i][j-1],f[i+1][j],f[i+1][j-1]}+1。#include<stdio.h>#include<string.h>#define MAXD 1010#define INF 1000000000char b[MAXD];int f[MAXD][MAXD];int dp(int x, int y){ int t, min = INF; if(f[x][y] != 阅读全文
posted @ 2011-11-26 03:08 Staginner 阅读(485) 评论(0) 推荐(0) 编辑
摘要: UVA_590 根据到达时间,我们可以把图看成有K层,然后用SPFA求到各个点的最短路即可。#include<stdio.h>#include<string.h>#define INF 1000000000int N, K, G[15][15][40], T[15][15], f[15][1010];int q[11000], d[11000], inq[15][1010];int init(){ int i, j, k; scanf("%d%d", &N, &K); if(!N && !K) return 0; fo 阅读全文
posted @ 2011-11-26 01:43 Staginner 阅读(369) 评论(0) 推荐(0) 编辑
  2011年11月25日
摘要: UVA_10651 由于总状态很少,所以直接广搜即可。#include<stdio.h>#include<string.h>#define MAXD 10010char b[20];int d[MAXD], q[MAXD], hash[MAXD], N;void init(){ int i, j; scanf("%s", b); N = q[0] = 0; for(i = 0; i < 12; i ++) { q[0] = (q[0] << 1) + (b[i] == 'o' ? (N ++, 1) : 0); }} 阅读全文
posted @ 2011-11-25 23:45 Staginner 阅读(253) 评论(0) 推荐(0) 编辑
摘要: UVA_10051 将一个立方体拆成6个,然后去求最长上升子序列即可。#include<stdio.h>#include<string.h>#define MAXD 3010char b[][10] = {"front", "back", "left", "right", "top", "bottom"};int N, w[MAXD], f[MAXD], upcol[MAXD], downcol[MAXD], d[MAXD], p[MAXD], a[1 阅读全文
posted @ 2011-11-25 21:06 Staginner 阅读(356) 评论(0) 推荐(0) 编辑
  2011年11月20日
摘要: Problem A 考察地形 题目中所描述的P即指任意两点之间的所有最短路径所覆盖的不同的路的条数,最后要求求P的最大值。 一个比较直接、暴力的想法就是首先用Floyd处理出任意两点i,j间的最短路,然后枚举i、j,每次扫描一遍顶点确定在所有最短路中都有哪些顶点,即对k满足f[i][k]+f[k][j]=f[i][j]。然后凡是最短路上的边,必然是k的集合中的点所连成的边,因此我们再一对一对枚举k集合中的点x、y,并判断两点间的那条路是否在最短路上,即是否满足f[i][x]+g[x][y]+f[y][j]==f[i][j]或者f[i][y]+g[y][x]+f[x][j]==f[i][j].. 阅读全文
posted @ 2011-11-20 18:54 Staginner 阅读(540) 评论(0) 推荐(0) 编辑
摘要: UVA_10069 这个题目一开始没有头绪,后来看了一下别人的题解顿悟了。 我们不妨设短串是a,长串是b,用数组f[i][j]表示到b的第j位时一共包含了多少个a到第i位的子序列。这样,动态转移方程就是f[i][j]=f[i][j-1];if(a[i]==b[j]) f[i][j]+=f[i-1][j-1];,同时我们需要初始化i=0时f[i][j]的值,即统计一下b中到第j位时出现了多少个a[0]即可。 为了能偷懒,就直接用java的BigInteger去写了。import java.math.BigInteger;import java.util.Scanner;public class. 阅读全文
posted @ 2011-11-20 00:23 Staginner 阅读(533) 评论(0) 推荐(0) 编辑
  2011年11月18日
摘要: 本次热身赛时间为2011.11.20 12:00-17:00,比赛形式为网络赛,地址在中南大学OJ上,题目共10道,全部为中文命题。 中南大学OJ链接: http://acm.csu.edu.cn/OnlineJudge/ 欢迎各位新手老手前来热身~O(∩_∩)O~,本次命题主题为“水上乐园”,愿大家玩的开心~ 赛后约1-2日内会在我的博客发布相关的解题报告,同时题目也会挂出来。 由于我要参加12月的月赛,所以就只好过把命制热身赛题目的瘾了。本次比赛题目原创比例还是比较高的,同时为了照顾我校刚开始搞ACM的同学,这次的题目测重点在于思维的灵活性,编码的复杂度并不高,同时加入了几个简... 阅读全文
posted @ 2011-11-18 20:25 Staginner 阅读(287) 评论(0) 推荐(0) 编辑
摘要: HDU_1116 用线段树支持单点修改和区间求和即可。#include<stdio.h>#include<string.h>#define MAXD 50010int N, M, tree[4 * MAXD];char b[20];void solve(){ int i, j, k, res, s, t; scanf("%d", &N); for(M = 1; M < N + 1; M <<= 1); memset(tree, 0, sizeof(tree)); for(i = 1, j = M + 1; i <= N 阅读全文
posted @ 2011-11-18 02:19 Staginner 阅读(200) 评论(0) 推荐(0) 编辑
上一页 1 ··· 59 60 61 62 63 64 65 66 67 ··· 85 下一页