动态规划矩形嵌套及DAG上的最短路径。
2014-02-02 17:10
381 查看
动态规划矩形嵌套及DAG上的最短路径。
矩形嵌套及DAG上的最短路径都属于差不多的dp题,,(这含义有点模糊。。= =
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
)
首先矩形嵌套。(转自某某人的博客。。不能怪我,我没有这么基础的题。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wronged.gif)
)
题目:
难度:4
描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽输出每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行样例输入
上面没有Sample Output,补充一下
Sample Output
5
还有DAG上的最短路径题目。。转自http://blog.csdn.net/wangran51/article/details/7674832。。
其实,我都没有怎么看懂,硬生生的全枚举了一遍。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/bye.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/bye.gif)
附上 很详细的代码及其解释。。
矩形嵌套的代码。。 = =
好开心,第一次会用上面的插入代码了。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
。。可是很忧伤啊,动态规划可是个很难得东西。。= =
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif)
DAG上的最短路径代码。。
都是从别人那里拿来的,好忧伤。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/knock.gif)
首先,分析矩形嵌套。
首先,我那个比较函数就不知道写。。后面还百度了一下。。= =
后面才知道是写struct ss,,大概是比较的参数的类型就是struct ss。。
然后,sort中是按cmp来排序,而且是按cmp为true的时候来排序的,感觉写的很含蓄。。。那就解释一下这个排序函数是首先按结构体中a的升序来排的,在两个架构体数组a相同的情况下是按b的升序来排的,这样说应该清楚很多。。= =。。
然后的一大串应该可以看懂。。= =。。
然后就是
这一段时核心代码,可以做模板用的。。。= =
矩形嵌套及DAG上的最短路径都属于差不多的dp题,,(这含义有点模糊。。= =
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)
)
首先矩形嵌套。(转自某某人的博客。。不能怪我,我没有这么基础的题。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wronged.gif)
)
题目:
矩形嵌套
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽输出每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行样例输入
1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2
上面没有Sample Output,补充一下
Sample Output
5
还有DAG上的最短路径题目。。转自http://blog.csdn.net/wangran51/article/details/7674832。。
其实,我都没有怎么看懂,硬生生的全枚举了一遍。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/bye.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/bye.gif)
附上 很详细的代码及其解释。。
矩形嵌套的代码。。 = =
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct SS { int a; int b; }q[1002]; bool cmp(struct SS p1,struct SS p2) { if(p1.a<p2.a) return true; if(p1.a==p2.a&&p1.b<=p2.b) return true; return false; } int dp[1002];//存储第i个之前符合条件的矩形最多的个数 int main() { int t,i,j,max,ans,temp,n; scanf("%d",&t); while(t--) { scanf("%d",&n); ans=1; for(i=0;i<n;i++) { scanf("%d%d",&q[i].a,&q[i].b); if(q[i].a>q[i].b) { temp=q[i].a; q[i].a=q[i].b; q[i].b=temp; } } sort(q,q+n,cmp) ; dp[0]=1; for(i=1;i<n;i++)//与求最长单调递增子序列相仿 { max=0; for(j=i-1;j>=0;j--) { if(q[i].a>q[j].a&&q[i].b>q[j].b) { if(max<dp[j]) { max=dp[j]; } } } dp[i]=max+1; if(ans<dp[i]) ans=dp[i]; } printf("%d\n",ans); } return 0; }
好开心,第一次会用上面的插入代码了。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
。。可是很忧伤啊,动态规划可是个很难得东西。。= =
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif)
DAG上的最短路径代码。。
1 #include<stdlib.h> 2 #include<stdio.h> 3 #define x 9999 4 #define max 9999 5 int data[10][10]; 6 int dist[10];//记录最短路径为多少 7 int path[10];//记录最短路径 8 int kmin(int,int); 9 void fpath(int a[][10]); 10 int froute(int a[][10]); 11 void main() 12 { 13 int i,m; 14 int a[10][10]={ 15 {x,4,2,3,x,x,x,x,x,x}, 16 {x,x,x,x,10,9,x,x,x,x}, 17 {x,x,x,x,6,7,10,x,x,x}, 18 {x,x,x,x,x,3,8,x,x,x}, 19 {x,x,x,x,x,x,x,4,8,x}, 20 {x,x,x,x,x,x,x,9,6,x}, 21 {x,x,x,x,x,x,x,5,4,x}, 22 {x,x,x,x,x,x,x,x,x,8}, 23 {x,x,x,x,x,x,x,x,x,4}, 24 {x,x,x,x,x,x,x,x,x,x}}; 25 26 /*for (i=0;i<10;i++) 27 { 28 for(j=0;j<10;j++) 29 printf("%d ",a[i][j]); 30 printf("\n"); 31 }*/ 32 fpath(a); 33 printf("最短路径大小为: %d\n",dist[9]); 34 35 m=froute(a); 36 for(i=m-1;i>=0;i--) 37 printf("最短路径经过: %d\n",path[i]); 38 } 39 void fpath(int a[][10]) 40 { 41 int i,j,k; 42 dist[0]=0; 43 for(i=1;i<10;i++) 44 { 45 k=max; 46 for(j=0;j<i;j++) 47 { 48 if(a[j][i]!=x) 49 if((dist[j]+a[j][i])<k) 50 k=dist[j]+a[j][i]; 51 } 52 dist[i]=k; 53 } 54 } 55 int froute(int a[][10]) 56 { 57 int j,b,k=1,i=9; 58 path[0]=10; 59 while(i>0) 60 { 61 for(j=i-1;j>=0;j--) 62 { 63 if(a[j][i]!=x) 64 { 65 b=dist[i]-a[j][i]; 66 if(b==dist[j]) 67 { 68 path[k++]=j+1; 69 i=j; 70 break; 71 } 72 } 73 74 } 75 } 76 return k; 77 } 78 79 80
都是从别人那里拿来的,好忧伤。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/knock.gif)
首先,分析矩形嵌套。
首先,我那个比较函数就不知道写。。后面还百度了一下。。= =
bool cmp(struct SS p1,struct SS p2) { if(p1.a<p2.a) return true; if(p1.a==p2.a&&p1.b<=p2.b) return true; return false; }首先bool cmp 中p1,p2前面的东西到底是写struct ss还是q就很头疼。。
后面才知道是写struct ss,,大概是比较的参数的类型就是struct ss。。
然后,sort中是按cmp来排序,而且是按cmp为true的时候来排序的,感觉写的很含蓄。。。那就解释一下这个排序函数是首先按结构体中a的升序来排的,在两个架构体数组a相同的情况下是按b的升序来排的,这样说应该清楚很多。。= =。。
然后的一大串应该可以看懂。。= =。。
然后就是
这一段时核心代码,可以做模板用的。。。= =
for(i=1;i<n;i++)//与求最长单调递增子序列相仿 { max=0; for(j=i-1;j>=0;j--) { if(q[i].a>q[j].a&&q[i].b>q[j].b) { if(max<dp[j]) { max=dp[j]; } } } dp[i]=max+1; if(ans<dp[i]) ans=dp[i]; }
相关文章推荐
- 紫书p263 嵌套矩形如何输出所有路径(DAG上的动态规划)
- nyoj16矩形嵌套(DAG上的动态规划)
- DAG上的动态规划--嵌套矩形
- 矩形嵌套 ————DAG(有向无环图)上的动态规划
- DAG上的动态规划 - 算法竞赛入门经典 - 嵌套矩形问题
- nyoj-16 矩形嵌套 (DAG上的动态规划,记忆化搜索)
- 矩形嵌套-DAG上的动态规划
- nyoj 16 嵌套矩形(DAG上的动态规划)
- 嵌套矩形——DAG上的动态规划
- ACM:DAG上的动态规划------嵌套矩形
- 嵌套矩形——DAG上的动态规划
- DAG上的动态规划之嵌套矩形
- 矩形嵌套(最小字典序)—DAG动态规划问题
- NYOJ 16 矩形嵌套(DAG上的动态规划)
- nyoj 16 矩形嵌套 (DAG上的动态规划)
- DAG上的动态规划(嵌套矩形)
- DP动态规划-嵌套矩形
- 动态规划——矩形嵌套问题
- 矩阵嵌套问题(DAG上的动态规划)
- NYOJ 16 (动态规划之嵌套矩形)