ships 船 动态规划

有一个国家被一条何划分为南北两部分,在南岸和北岸总共有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);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值