2011年12月4日
摘要: UVA_662 首先我们考虑区间[i,j]内如果建一个餐馆应该建在哪个位置,比较容易证明应该是建在中间的位置,如果是偶数个元素,中间两个位置随便一个都可以。这样我们就可以预处理出区间[i,j]内建一个餐馆的最小总路程A[i][j]了。 我们可以用f[i][j]表示第i个餐馆服务到第j个位置所需的最小总路程,那么f[i][j]=min{f[i-1][k]+A[k+1][j]},其中i-1<=k<j。#include<stdio.h>#include<string.h>#define MAXD 210#define MAXK 40#define INF 0x3f 阅读全文
posted @ 2011-12-04 22:24 Staginner 阅读(423) 评论(0) 推荐(0) 编辑
摘要: UVA_10564 我们可以用f[i][j][k]表示到第i行第j个格子时路径上值得和是否可以为k,为了保证记录的路径字典序最小的,我们可以将i由大向小循环。 状态转移的思路还是很好想的,但是写起来有些蛋疼。#include<stdio.h>#include<string.h>#define MAXD 50#define MAXS 520int N, S, f[MAXD][MAXD][MAXS], p[MAXD][MAXD][MAXS], num[MAXD], a[MAXD][MAXD];long long int d[MAXD][MAXD][MAXS];int ini 阅读全文
posted @ 2011-12-04 17:31 Staginner 阅读(451) 评论(0) 推荐(0) 编辑
摘要: UVA_10635 这个题目显然用n^2的最长公共子序列的算法会超时,后来看了别人的解题报告发现,原来最长公共子序列可以转化成最长上升子序列的问题,然后用最长上升子序列的nlogn的算法求解。 但这个方法要求任意一个字符在两序列中出现的频率都要比较低,因为转化成最长上升子序列的算法的最坏复杂度是n^2log(n^2)。而这个题目恰好每个数字最多只在两序列中各出现一次,所以就可以达到nlogn的复杂度了。#include<stdio.h>#include<string.h>#define MAXD 70000int N, P, Q, s[MAXD], r[MAXD];vo 阅读全文
posted @ 2011-12-04 17:04 Staginner 阅读(829) 评论(5) 推荐(0) 编辑