UVA103 DP记忆化搜索
2013-10-09 12:36
260 查看
这个题用了一种方法,两种形式搞的,非递归形式的DP没过,于是按照相同的思路写了个递归形式的记忆化搜索的方法。然后过了。
dp[i][j]代表第i个箱子选择j的时候的最长序列。
这个题目中把箱子当做点把可以包含当做边的话则形成一个DAG,所以可以放心的进行搜索。
AC代码
dp[i][j]代表第i个箱子选择j的时候的最长序列。
这个题目中把箱子当做点把可以包含当做边的话则形成一个DAG,所以可以放心的进行搜索。
AC代码
#include<stdio.h> #include<algorithm> #include<stack> #include<string.h> using namespace std; const int MAX=100; stack<int> path; int nest[MAX][MAX];//i 可以包括的 int box[MAX][MAX]; int visit[MAX]; int pre[MAX]; int n,d; int max(int a,int b) { return a>b?a:b; } int result; int search(int a) { if(visit[a]!=0) return visit[a]; int i,j,k; visit[a]=1; for(i=0;i<n;i++) { if(nest[a][i]==1) { result=search(i)+1; if(result>visit[a]) { visit[a]=result; pre[a]=i; } } } return visit[a]; } int main() { int i; while(scanf("%d%d",&n,&d)!=EOF) { memset(visit,0,sizeof(visit)); for(i=0;i<n;i++) pre[i]=i; int i,j,k; bool flag; for(i=0;i<n;i++) for(j=0;j<d;j++) scanf("%d",&box[i][j]); for(i=0;i<n;i++) sort(box[i],box[i]+d); for(i=0;i<n;i++) for(j=0;j<n;j++) { flag=1; for(k=0;k<d;k++) { if(box[i][k]<=box[j][k]) { flag=0; break; } } nest[i][j]=flag; } for(i=0;i<n;i++) search(i); int m=-1; int c; for(i=0;i<n;i++) if(m<visit[i]) { m=visit[i]; c=i; } while(pre[c]!=c) { path.push(c); c=pre[c]; } path.push(c); printf("%d\n",m); while(!path.empty()) { c=path.top()+1; path.pop(); printf("%d ",c); } printf("\n"); } }
相关文章推荐
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
- Uva-103-Stacking Boxes
- uva103
- UVA 103 Stacking Boxes
- 【解题报告】uva103_Stacking Boxes(堆砌盒子, dp)
- ACM UVa 算法题100, 101, 103, 104, 112, 10405解法
- uva 103 - Stacking Boxes
- UVA 103 Stacking Boxes
- uva1631(DP记忆化搜索)
- UVA 103
- UVa 103 Stacking Boxes --- DAG上的动态规划
- UVa 103 Stacking Boxes
- uva 103 (dp)Stacking Boxes
- uva103-Stacking_Boxes(dp最长递增子序列)
- UVA - 103 Stacking Boxes
- UVa 103 - Stacking Boxes
- uva 103 - Stacking Boxes 动态规划——最长路及字典序
- UVa 103 Stacking Boxes
- UVA 103 - Stacking Boxes