2011年11月26日
摘要: 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 不是我干的 阅读(138) 评论(0) 推荐(0)
摘要: 题意:一群匪徒要进入一个酒店。酒店的门有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) 推荐(0)
摘要: 题意:裸的最长上升子序列。思路:传统的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 不是我干的 阅读(178) 评论(0) 推荐(0)
摘要: 巨水的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 不是我干的 阅读(134) 评论(0) 推荐(0)