【动态规划DP,一维动归】poj1857,To Europe! To Europe!

http://poj.org/problem?id=1857

要运送车辆到对岸.车辆已经排好队,注意因为桥窄不能超车, 分组的时候不能随意分组,前一组的车辆都排在后一组车辆的前 面,即车辆的顺序是按输入固定的。 只有一座单行的桥, 每辆车有其重量及最最快车速, 通过分组方式将车辆分成几组运输, 每次只能运一组运到对岸后第二组才能出发, 每组中车辆的总重量不能超过桥的载重量, 运输速度则取决于该组车辆中最慢的那辆。
问如何分组,运输最快。

动态规划,从前向后,依次求出到i位置时的最优解,考i位置的时候,考虑i-1,i-2... 直到i - j加在一起超过了载重量,则所有这些位置可能性都需要考虑到。

考虑如果没有速度区别,应该是贪心算法,考虑i位置的时候向前,该组装的越多越好。


AC代码:

# include<iostream>
# include<stdio.h>
using namespace std;

# define N 1005


double result[N],t;

int main()
{
	int b,l,n,ws[N][2],w,s;
	int i,j;
	
	while(true)
	{
		cin>>b>>l>>n;
		if(b==0 && l==0 && n==0)
		{
			break;
		}
		l*=60;

		result[0]=0.0; //guarder: result[i]=l*60.0/ws[i][1]+result[i-1]; and t=l*60.0/s+result[j-1];
		for(i=1;i<=n;i++)
		{
			cin>>ws[i][0]>>ws[i][1];

			//先单独走
			result[i]=l*1.0/ws[i][1]+result[i-1];

			//和前面依次组合
			w=ws[i][0];
			s=ws[i][1];
			for(j=i-1;j>=1&&(w+=ws[j][0])<=b;j--)
			{
				if(ws[j][1]<s)
				{
					s=ws[j][1];
				}
				t=l*1.0/s+result[j-1];
				if(result[i]>t)
				{
					result[i]=t;
				}
			}
		}

		printf("%.1f\n",result[n]);
	}
	return 0;
}



没AC,但觉得思路没错(有知道怎么回事的留个言,多谢^_^):

# include<iostream>
# include<stdio.h>
using namespace std;

# define N 1003
# define INF_TIME 100000.0


double lowTime[N][N],result[N];

int main()
{
	int b,l,n,i,j,k;
	int ws[N][2];
	
	while(true)
	{
		cin>>b>>l>>n;
		if(b==0 && l==0 && n==0)
		{
			break;
		}
		for(i=1;i<=n;i++)
		{
			cin>>ws[i][0]>>ws[i][1];
		}
		for(i=1;i<=n;i++)
		{
			k=0;
			lowTime[i][i-1]=0.0;
			for(j=i;j<=n;j++)
			{
				k+=ws[j][0];
				if(k>b)
				{
					lowTime[i][j]=INF_TIME;
				}
				else
				{
					lowTime[i][j]= lowTime[i][j-1]>(l*60.0/ws[j][1])? lowTime[i][j-1]:(l*60.0/ws[j][1]) ; // >
				}
			}
		}

		result[1]=lowTime[1][1];
		for(i=2;i<=n;i++)
		{
			//result[i]= min( min(j:[1,i-1]=>result[j]+lowTime[j+1][i]), lowTime[1][i] );
			result[i]=lowTime[1][i];
			for(j=1;j<=i-1;j++)
			{
				result[i]= result[i]<result[j]+lowTime[j+1][i]? result[i]:result[j]+lowTime[j+1][i];
			}
		}
		printf("%.1f\n",result[n]);
	}
	return 0;
}




你可能感兴趣的:(TO,TO,europe,europe,动态规划DP,一维动归,poj1857)