POJ1207 水题
摘要:思路:其实很道路很水,显然如果增大的话是3的指数增大,所以即使n=10000,但是其实回归到1的时间也只是log的时间而已。所以可以直接暴力打表。写递归只是练习一下记忆化搜索。感觉DFS的基础真是不扎实。菜啊。最恶心的是给的数据范围有可能是坐边数字大于右边。因此wa了好多次。。#include<iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
const int N=10005;
int data[N];
void dfs(int i,int k,int s)
{ if(i<N&&data
阅读全文
posted @
2011-12-17 11:51
不是我干的
阅读(203)
推荐(0)
POJ1118 Lining Up 计算几何
摘要:题意:给你一个二维坐标上的几个点,问在同一条直线上最多几个点。思路:N=700,刚开始我枚举两个点i,j。(两个点一条线),然后用k枚举一遍各个点。这样算出每条线上最多的点。用了O(N^3)的超时了。我真是太天真了。其实在枚举每个k的时候就可以想到。k明显有一些可以优化的地方。优化:之前是枚举每条线,现在是枚举每个点,对于每个点i,求i和其它所有点的斜率。找出斜率相同点的个数。(用hash空间承受不来),所有用sort(O(nLOGn))即可找出。所有现在是O(N^2*LOGN),200+ms。#include<iostream>
#include<algorithm>
阅读全文
posted @
2011-12-06 21:33
不是我干的
阅读(327)
推荐(0)
POJ2828 Buy Tickets 线段树
摘要:思路:查看了网上不少博客,感觉都写得很朦胧,都说从后往前插。这个倒好理解。但是很多都没说清楚为什么用线段树,用的思路。搞得我一头雾水。毕竟是刚接触线段树,对线段树理解也不够。今天晚上硬着头皮推敲。终于有点思路了。我的理解:就例子0 201 191 380 31从后往前插。首先是0 31.位置是精确的就是在第0位。然后是1 38.38想插在第1位。但是这是38一厢情愿,他能不能最终落在第1位,必须经过0 31的同意。即因为在1 38的操作后,0 31的操作会使1 38位置变动。怎么变动?很简单,就是往后退一位,使1 38的操作最终下场是38落在了位置1+1=2,第2位。说到这里是不是有点启发了。
阅读全文
posted @
2011-12-04 13:20
不是我干的
阅读(208)
推荐(0)
POJ1007 DNA Sorting 水题
摘要:题意:给你一个DNA的序列,给定逆序数的定义,叫你按逆序数从小到大排序输出。其实很简单。只不过为了排序,弄个结构体出来比较方便。#include<iostream>
#include<queue>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#include<algorithm>
using namespace std;
const int N=55,M=105;
int n,m;
char str[M][N];
struct Node
{ int id,num;
}node[M];
阅读全文
posted @
2011-12-03 16:59
不是我干的
阅读(208)
推荐(0)
POJ2777 Count Color 线段树
摘要:题意:给一个固定长度为L的画板有两个操作:C A B C:区间AB内涂上颜色C。P A B:查询区间AB内颜色种类数。思路:首先显然是要线段树。每个节点有如下参数:l,r 表示区间。int color表示颜色,对于颜色要用位运算。刚开始我的做法是对于每个C操作,就更新区间为AB的节点及其所有子节点。然后TLE了。其实本质原因是没有理解好线段树的精髓。线段树的精髓在于插入(或者更新)和查询都是从根节点开始!所以我们无需每次涂色都更新到叶子节点。具体的解释在代码里。#include<iostream>
using namespace std;
int l,t,o;
const int
阅读全文
posted @
2011-12-01 23:17
不是我干的
阅读(241)
推荐(0)
POJ3264 Balanced Lineup 线段树基础
摘要:第一次接触线段树。题意:又见farmer john。有N只牛,每只牛都有它的身高。给出任意一个区间[i ,j],叫你求出这个第i只牛到第j只牛这些牛中身高最高的和最低的差值。思路:线段树。每个树节点有参数:L=区间左值R=区间右值MAX=区间内身高最大值MIN=区间内身高最小值#include<iostream>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int SUM=150010;
const int MAX=(1<<30);
cons
阅读全文
posted @
2011-11-29 09:07
不是我干的
阅读(120)
推荐(0)
POJ1887 Testing the CATCHER 最大下降子序列 DP
摘要:思路:裸的最大下降子序列#include<iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
const int N=10010;
const int inf=32770;
int num[N],dp[N];
int n;
int solve()
{ int ans=0; memset(dp,0,sizeof(dp)); num[0]=inf; for(int i=1;i<=n;i++) { for(int j=i-1;j>=0;j--) { if(num[i]<=num[j]) { dp[i.
阅读全文
posted @
2011-11-27 21:58
不是我干的
阅读(150)
推荐(0)
POJ3096 Surprising Strings 水题
摘要:题意:给定一个字符换,给定surprising的定义。要求判断是否。思路:水题。因为很久没用map了,特地用下map。#include<iostream>
#include<string>
#include<map>
using namespace std;
string str;
int main()
{ while(cin>>str,str!="*") { bool flag=true; for(int i=0;i<str.length()&&flag;i++) { map<string,int
阅读全文
posted @
2011-11-27 10:58
不是我干的
阅读(284)
推荐(0)
POJ3670 Eating Together LIS DP
摘要:LIS的简化版。#include<iostream>
using namespace std;
const int N=30005;
int n;
int data[N];
int stack[N];
int sp;
inline void insert(int dat)
{ int head=1,tail=sp-1; int mid; while(head<tail) { mid=(head+tail)/2; if(stack[mid]<=dat) { head=mid+1; } else { tail=mid; } } stack[hea...
阅读全文
posted @
2011-11-26 23:33
不是我干的
阅读(140)
推荐(0)
POJ1036 Gangsters DP
摘要:题意:一群匪徒要进入一个酒店。酒店的门有k+1个状态,每个匪徒的参数是:进入时间,符合的状态,携带的钱。酒店的门刚开始状态0,问最多这个酒店能得到的钱数。思路:dp数组为DP[T][K].转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])因为转移i只跟i-1有关,所以可以用滚动数组dp[2][k].其实这道题的转移方程很容易想到,只是编程的时候处理边界等细节比较麻烦。#include<iostream>
#include<algorithm>
#define max(a,b) (a>b?a:b)
using
阅读全文
posted @
2011-11-26 19:42
不是我干的
阅读(166)
推荐(0)
POJ3903 Stock Exchange 最长上升子序列DP]
摘要:题意:裸的最长上升子序列。思路:传统的O(N^2)的DP没法过。用O(NLOGN)的贪心方法过。#include<iostream>
using namespace std;
const int N=100005;
int n;
int stack[N];
int sp;
void insert(int t)
{ int head=1; int tail=sp-1; int mid; while(head<tail) { mid=(head+tail)/2; if(stack[mid]<t) { head=mid+1; } else { tail=...
阅读全文
posted @
2011-11-26 16:33
不是我干的
阅读(180)
推荐(0)
POJ1953 World Cup Noise DP水题
摘要:巨水的dp。思路很简单:每次dp[i]都是和dp[i-1]时候的0的个数和1的个数有关而已。打表之后发现是斐波那契数列。。。。。。#include<iostream>
using namespace std;
const int N=50;
long long int dp[N];
int n;
void solve()
{ dp[1]=2; long long a=1,b=1; for(int i=2;i<=45;i++) { long long tmp=a+b; b=a; a=tmp; dp[i]=a+b; }
}
int main()
{ solve...
阅读全文
posted @
2011-11-26 14:04
不是我干的
阅读(135)
推荐(0)
POJ1050 TO THE MAX [DP]
摘要:多天之前就理清了这题的思路,因为这礼拜六考通原,一直没开编译器A了这题。终于在考通原前一天憋的蛋疼A之。题意:求最大矩阵。思路:是很好的最长连续子序列的变形题。一维最长连续子序列状态转移方程:dp[k]=max(dp[k-1]+mat[k],mat[k]);(*)现在是求最大矩阵:启发:试想,我们求出的最大矩阵和之前一维的最大子序列的差别就是多了连在一起的几行。即“变厚了”。试想行数为1时,列数为n时,用方程(*)解。行数为2时,列数为n时,就是先求一下第一行的,然后求第二行的,然后求第一行同列数字相加成的(即压扁后的)。.....这样就能发现此中的规律,详细看代码。#include<i
阅读全文
posted @
2011-11-25 20:59
不是我干的
阅读(120)
推荐(0)
POJ2479 Maximum sum 最长连续子序列[DP]
摘要:题意:先给一个序列,求两个最长连续子序列的和,看公式就很容易理解题意。思路:最长连续子序列的状态转移方程f[i]=max(f[i-1]+w[i],w[i])解决这道题的关键点在于要先正序处理一遍,然后再逆序处理一遍。然后枚举这个序列的分割点。这样时间复杂度为O(n);#include<iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
const int N=50005;
int n;
int mat[N];
int remat[N];
int in[N];
void dp()
{ for(int i=1;i&l
阅读全文
posted @
2011-11-12 19:34
不是我干的
阅读(182)
推荐(0)
POJ1458 Common Subsequence LCS问题入门题[DP]
摘要:入门题。#include<iostream>
#include<string>
#define max(a,b) (a>b?a:b)
using namespace std;
char s1[500],s2[500];
int n1,n2;
int mat[2][500];
int main()
{ while(scanf("%s%s",s1+1,s2+1)!=EOF) { memset(mat,0,sizeof(mat)); n1=strlen(s1+1); n2=strlen(s2+1); for(int i=1;i<=n1;i++)
阅读全文
posted @
2011-11-12 16:31
不是我干的
阅读(117)
推荐(0)