摘要:
#include<stdio.h>#include<string.h>int n;int q;int tot;struct Tnode { int l; int r; int pl; int pr; int sum;}node[200000];char str[1000000];int mid(int a,int b){ return (a+b)/2;}int buildtree(int l,int r){ int p=tot++; node[p].l=l; node[p].r=r; node[p].sum=0; if(l<r){ node[p].pl=build
阅读全文
posted @ 2011-07-12 22:47
Eucalyptus
阅读(139)
推荐(0)
编辑
摘要:
第一次用线段树,G++ 2984ms,未用输入输出优化。#include<stdio.h>#define inf 1000000000int min(int a,int b){ return a>b ? b:a;}int max(int a,int b){ return a>b ? a:b;}int mid(int a,int b){ return (a+b)/2;}struct Tnode { int l; int r; int pl; int pr; int minval; int maxval;}node[10000000];int tot;int buildtr
阅读全文
posted @ 2011-07-12 01:48
Eucalyptus
阅读(200)
推荐(0)
编辑
摘要:
定义:线段树是一种的二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2,b]。因此线段树是满二叉树,最后的子节点数目为N,即整个线段区间的长度。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩。线段树至少支持下列操作:Insert(t,x):将包含区间 int 的元素 x 插入到树t中;Delete(t,x):从线段树 t 中删除元素
阅读全文
posted @ 2011-07-09 17:45
Eucalyptus
阅读(1835)
推荐(0)
编辑
摘要:
感觉这题上了些难度了。。第一次做三维DP。。。昨晚看完后睡了10个小时后想出来了。。。睡眠果然是精力集中的保障啊。。。还有这题倒着推很好写状态转移方程: dp[i][j][k]=min(dp[i+1][j][k]+map[i][i+1],dp[i+1][i][k]+map[j][i+1],dp[i+1][i][j]+map[k][i+1]);//为避免混淆。。。数组还是从1开始搞起吧。。。#include<stdio.h>#include<string.h>#define inf 100000000int ncase;int n;int map[35][35];int
阅读全文
posted @ 2011-07-09 14:16
Eucalyptus
阅读(304)
推荐(0)
编辑
摘要:
DP解法:最优子结构分析:如上例,如果A、B可以组成C,那么,C最后一个字母e,必定是 A 或 C 的最后一个字母组成。C去除除最后一位,就变成是否可以求出 A-1和B 或者 A与B-1 与 是否可以构成 C-1。。。状态转移方程:用f[i][j] 表示 表示A前 i 为 和B 前j 位是否可以组成 C的前i+j位 dp[i][j]= (dp[i-1][j]&&(a[i]==c[i+j]))||(dp[i][j-1]&&(b[j]==c[i+j]))代码:#include<stdio.h>#include<string.h>char a[
阅读全文
posted @ 2011-07-08 23:23
Eucalyptus
阅读(462)
推荐(1)
编辑
摘要:
素数环。。DFS暴搜。。很奇怪为什么用C++交总提示我SQRT调用不明确。。还是用G++提交吧。。#include<stdio.h>#include<string.h>#include<math.h>int visited[21];int num[21];int n;void print(){ for (int i=0; i<n; i++) { printf("%d",num[i]); if(i!=n-1) putchar(' '); } putchar('\n');}int sushu(int p)
阅读全文
posted @ 2011-07-08 15:11
Eucalyptus
阅读(129)
推荐(0)
编辑
摘要:
。。。一个变量打错。。。调了一个上午。。。擦的#include<stdio.h>#include<string.h>int n,k;int a[100][100];int dp[100][100];int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};int inarea(int x,int y){ return x>=0 && y>=0 && x<n && y<n;}int dfs(int x,int y){ if (dp[x][y]>0) return dp
阅读全文
posted @ 2011-07-08 09:09
Eucalyptus
阅读(214)
推荐(0)
编辑
摘要:
状态转移方程:dp[i][j]=max{dp[i-1][k]}(i-1<=k<=j-1)+a[i][j]代码:#include<stdio.h>int F,V;int a[100][100];int dp[100][100];int main(){ scanf("%d%d",&F,&V); for (int i=0; i<F; i++) for (int j=0; j<V; j++) scanf("%d",a[i]+j); for (int i=0; i<V; i++) //处理边界 dp[0][
阅读全文
posted @ 2011-07-08 01:10
Eucalyptus
阅读(175)
推荐(0)
编辑
摘要:
类似的数塔过河卒[问题描述]: 如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。 [输入]: 键盘输入 B点
阅读全文
posted @ 2011-07-08 00:10
Eucalyptus
阅读(1419)
推荐(0)
编辑
摘要:
四个基本概念:阶段、状态、决策、状态转移方程两个基本原理:无后效性原则、最优化原理最优化原理:贪心和动态规划都需要最优化原理作为基础 有n个数,有正有负,需要为他们每个数选择乘上1或者-1 1. 如果需要选择后所有数相加和最小,如何选择? 2. 如果需要选择后所有数相加和绝对值最小,如何选择? 对于1,每次使部分和最小可以得出最终的和最小 对于2,每次使绝对值最小不能得出最终的绝对值最小坐标类动态规划的总结: 1. 直接以位置为状态 2. 位置的变换作为转移的形式 3. F[当前位子] = F[前面位置] + 转移代价1. 过河卒: 热身2. 花瓶: 稍稍不那么明显的路径问题,明确解题模式:
阅读全文
posted @ 2011-07-07 23:13
Eucalyptus
阅读(354)
推荐(0)
编辑