您的位置:首页 > 其它

动态规划矩形嵌套及DAG上的最短路径。

2014-02-02 17:10 381 查看
动态规划矩形嵌套及DAG上的最短路径。

矩形嵌套及DAG上的最短路径都属于差不多的dp题,,(这含义有点模糊。。= =



首先矩形嵌套。(转自某某人的博客。。不能怪我,我没有这么基础的题。。



题目:



矩形嵌套

时间限制: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。。

其实,我都没有怎么看懂,硬生生的全枚举了一遍。。




附上 很详细的代码及其解释。。

矩形嵌套的代码。。 = =

#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;
}


好开心,第一次会用上面的插入代码了。。

。。可是很忧伤啊,动态规划可是个很难得东西。。= =


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


都是从别人那里拿来的,好忧伤。。


首先,分析矩形嵌套。

首先,我那个比较函数就不知道写。。后面还百度了一下。。= =

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];
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: