摘要: //滑雪,记忆化搜索解决//dp[i][j]表示从(i,j)开始出发所能滑的最长长度//显然状态转移方程为dp[i][j]=max{上下左右四个方向的dp值}+1;//我们只需要在DP过程中时刻更新最大值MAX即可#include <stdio.h>#include <string.h>#define N 110int R,C;int a[N][N],dp[N][N],MAX;bool vis[N][N];int x[5]={0,-1,1,0,0}, y[5]={0,0,0,-1,1};void DP(int i , int j){ int k,xx,yy,tmp; i 阅读全文
posted @ 2012-10-26 12:51 Titanium 阅读(144) 评论(0) 推荐(0) 编辑
摘要: LIS裸题, 是严格递增的不是 不下降子序列(一开始看错了WA了好几次)O(n*n)#include <stdio.h>#include <string.h>#define N 10100int a[N];int n;void LOS(){ int dp[N],i,j,tmp,max; memset(dp,0,sizeof(dp)); dp[1]=1; max=1; for(i=2; i<=n; i++) { for(tmp=0,j=1; j<i; j++) if(a[i]>a[j] && dp[j]>tmp) ... 阅读全文
posted @ 2012-10-26 11:02 Titanium 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 裸题,最大子矩阵和,将二维压缩为一维,以行为准,每次枚举一行的和(从i列到j列的和),再对行进行最大子序列和DP求解,时间复杂度为O(N^3)#include <stdio.h>#include <string.h>#define INF -1000000000#define N 110int a[N][N];int sum[N];int n;void input(){ int i,j; scanf("%d",&n); for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d&q 阅读全文
posted @ 2012-10-26 10:44 Titanium 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 简单骑士周游问题,BFS,有障碍物,(可能存在无障碍物的情况),起点和终点不会相同,起点终点无障碍物若能从起点出发到终点则输出步数,否者输入不能到达#include <stdio.h>#include <string.h>#include <queue>#define N 70using namespace std;bool g[N][N];int b;int start,end;struct node{ int n,r,c,k;};queue<struct node> q;int BFS(){ int ans,i,k,R[10],C[10],F 阅读全文
posted @ 2012-10-26 10:41 Titanium 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 其实解释POJ 2533 原题最长上升子序列,用O(N*N)算法和o(n*logn)算法分别实现,学校OJ的数据比较弱,就算写成最长不下降子序列也可以通过,但是在POJ上是WA的而题意本身应该是严格递增的o(N*N)#include <stdio.h>#include <string.h>#define N 10010int a[N];int n;void LOS(){ int dp[N],i,j,tmp,max; memset(dp,0,sizeof(dp)); dp[1]=1; max=1; for(i=2; i<=n; i++) { for(t... 阅读全文
posted @ 2012-10-26 10:37 Titanium 阅读(194) 评论(0) 推荐(0) 编辑