ships 船 动态规划

来源:互联网 发布:冰雪奇缘主要内容知乎 编辑:程序博客网 时间:2024/06/08 00:26
有一个国家被一条何划分为南北两部分,在南岸和北岸总共有N个城镇,每一城镇
在对岸都有唯一的友好城镇。任何两个城镇都没有相同的友好城镇。每一对友好城
镇都希望有一条航线来往。于是他们向政府提出了申请。由于河终年有雾。政府决
定不允许有任两条航线交叉(如果两条航线交叉,将有很大机会撞船)。
你的任务是缟写一个程序来帮政府官员决定他们应拨款兴建哪些航线以使到没有出
现交叉的航线最多。
输入数据
输入文件(ship.in)包括了若干组数据,每组数据格式如下:
第一行两个由空格分隔的整数x,y,10〈=x〈=6000,10〈=y〈=100。x 表示河的
长度而y表示宽。第二行是一个整数N(1<=N<=5000),表示分布在河两岸的城镇对数
。接下来的N行每行有两个由空格分隔的正数C,D(C、D〈=x〉,描述每一对友好
城镇沿着河岸与西边境线的距离,C表示北岸城镇的距离而D表示南岸城镇的距离。
在河的同一边,任何两个城镇的位置都是不同的。整个输入文件以由空格分隔的两

个0结束。

输出数据
输出文件(ship.ou)要在连续的若干行里给出每一组数据在安全条件下能够开通的

最大航线数目。

#include<stdio.h>#define MaxVillage 20//排序void sort(int*a,int*b,int n){int t=0;for(int i=0;i<n-1;i++){for(int j=0;j<n-i-1;j++){if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;t=b[j];b[j]=b[j+1];b[j+1]=t;}}}}void getMaxShip(int*a,int*b,int n){int tag[MaxVillage];int shipSum=0;for(int i=0;i<n;i++){tag[i]=1;for(int j=0;j<i;j++){if(a[i]>a[j]&&b[i]>b[j]&&tag[i]<=tag[j]){tag[i]=tag[j]+1;}}if(tag[i]>shipSum){shipSum=tag[i]+1;}}printf("船的数量:%d\n",shipSum);}void main(){int n;                    //村庄的数量scanf("%d",&n);int a[MaxVillage];int b[MaxVillage];int i;for(i=0;i<n;i++){scanf("%d%d",&a[i],&b[i]);}sort(a,b,n);getMaxShip(a,b,n);}





原创粉丝点击