上一页 1 ··· 21 22 23 24 25 26 27 28 29 ··· 85 下一页
  2012年5月4日
摘要: 由于上司的关系构成了一颗树,于是我们可以从树形dp的角度去考虑问题。不妨用f[cur][0]表示不选当前节点时这棵子树value的最大值,f[cur][1]表示选当前节点时这棵子树value的最大值,那么如果不选当前节点,它的子节点就可选也可不选,因此f[cur][0]要加上所有子节点x的Max{f[x][1],f[x][0]},而如果选当前节点,它的子节点必然不能选,因此f[cur][1]要加上所有子节点x的f[x][0]以及当前节点本身的value。#include<stdio.h>#include<string.h>#define MAXD 6010int N, 阅读全文
posted @ 2012-05-04 14:02 Staginner 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 这个题目可以用有限自动机的理论去做,也可以在设定好各个状态后枚举可能的情况并跳转状态,比如句子已经结束这个状态设为0,处于单词中这个状态设为1,在句子中间非单词部分时这个状态设为2,这样如果处于状态0但是遇到了小写字母就算是一个错误,处于状态1但遇到了大写字母也算是一个错误。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 100010int N, cnt;char b[MAXD];char isend(char ch){ return ch == '.' || 阅读全文
posted @ 2012-05-04 13:35 Staginner 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 为了查找标号最小的可用的block可以用一个以block标号为关键字的最小堆实现,同时为了能够修改正在使用的block延续的时间以及适时free过时的block,可以另外开一个以block开始使用的时刻为关键字的最小堆。#include<stdio.h>#include<string.h>#define MAXD 30010#define INF 0x3f3f3f3fconst int N = 30000, T = 600;int now, M, u[4 * MAXD], t[4 * MAXD], last[2 * MAXD];char b[5];void build( 阅读全文
posted @ 2012-05-04 00:05 Staginner 阅读(213) 评论(0) 推荐(0) 编辑
  2012年5月3日
摘要: URAL_1036 用f[i][j]表示递推到第i位时数字和为j的方案数,最后用下乘法原理f[N][S/2]*f[N][S/2]就是最后结果。 由于结果比较大,所以需要高精度。import java.math.BigInteger;import java.util.Scanner;public class Main { static int N, S; static BigInteger[][] f = new BigInteger[60][510]; public static void main(String[] args) { Scanner cin ... 阅读全文
posted @ 2012-05-03 21:19 Staginner 阅读(705) 评论(0) 推荐(0) 编辑
摘要: URAL_1034 和经典的N皇后问题很相似,尽管N比较大,但由于只重新安排3个皇后有C(N,3)种情况,每个皇后至多有3个位置可以放,所以最大也就是有C(50,3)*3^3种情况。 位运算版的N皇后问题详见Matrix67的博客:http://www.matrix67.com/blog/archives/266。#include<stdio.h>#include<string.h>#define MAXD 60int N, cnt, visr[MAXD], visc[MAXD], vis[MAXD][MAXD];struct Point{ int x, y;}p[MA 阅读全文
posted @ 2012-05-03 16:20 Staginner 阅读(325) 评论(0) 推荐(0) 编辑
摘要: URAL_1033 要注意下两个entrance不一定是连通的,然后用dfs计数就可以了。#include<stdio.h>#include<string.h>#define MAXD 40int N, g[MAXD][MAXD], vis[MAXD][MAXD];char b[MAXD];int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};void init(){ int i, j, k; memset(g, 0, sizeof(g)); for(i = 1; i <= N; i ++) { scanf("%s 阅读全文
posted @ 2012-05-03 14:21 Staginner 阅读(185) 评论(0) 推荐(0) 编辑
摘要: URAL_1032 这个题目不像网上有些人说的“需要选连续的数,是因为翻译的问题”,因为可以证明这个题目一定有解,而且可以证明一定存在一个选择连续的数的解。 不妨设a[i]为第i个数,A[i]=(a[1]+a[2]+…+a[i])%N,这样首先如果A[i]=0那么选择前i个数就可以了,如果不存在A[i]=0,那么A[i]的取值范围就缩小到了1~N-1,那么必然有两个不同的数x、y(x<y)使得A[x]=A[y],那么就有A[y]-A[x]=(a[x]+a[x+1]+…+a[y])%N=0,于是将第x个至第y个数选出来即可。 于是我们接下来要做的就是去找令A[x]=A[y]的x和y(可以补 阅读全文
posted @ 2012-05-03 13:54 Staginner 阅读(248) 评论(0) 推荐(0) 编辑
摘要: URAL_1031 dp的方程还是很好写的,但如果用裸的O(N^2)的dp的话应该会超时(不过后来翻解题报告的时候有人说O(N^2)也可以过),于是要优化dp的过程。 既然维数已经是一维了,不妨去着眼优化决策的过程,于是猜想到可能费用随着距离的增加是单调递增的(不过即便不是单调递增的,根据dp的方程我们也依然可以用单调队列进行优化),下面就来证明这一点。 设由x出发到y、z(x<y<z),花费分别为f[y]、f[z]。假设x->z的最优方案中在y的前面紧邻y的那一站是t(t等于y也可以),于是整体路程就变成了x->t->z,构造x->y的路线为x->t 阅读全文
posted @ 2012-05-03 10:48 Staginner 阅读(293) 评论(0) 推荐(0) 编辑
  2012年5月2日
摘要: URAL_1029 dp。#include<stdio.h>#include<string.h>#define MAXN 110#define MAXM 510int N, M, a[MAXN][MAXM], p[MAXN][MAXM];long long f[MAXN][MAXM];void init(){ int i, j; for(i = 1; i <= N; i ++) for(j = 1; j <= M; j ++) scanf("%d", &a[i][j]);}void dfs(int x, int y){ if(p[ 阅读全文
posted @ 2012-05-02 21:55 Staginner 阅读(249) 评论(0) 推荐(0) 编辑
摘要: URAL_1028 将点排序后依次插入线段树,就可以将计算星星等级转化成区间求和的问题了,于是用线段树支持单点修改和区间求和即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 15010#define MAXX 32010struct Point{ int x, y;}p[MAXD];const int D = 32000;int N, num[4 * MAXX], h[MAXD];int cmp(const void *_p, const void *_q){ Point 阅读全文
posted @ 2012-05-02 21:29 Staginner 阅读(286) 评论(0) 推荐(0) 编辑
上一页 1 ··· 21 22 23 24 25 26 27 28 29 ··· 85 下一页