POJ 1297-Supermarket(DP)

题目大意:有M(1<=M<=100)个物品要买,在市场上有N(1<=N<=100000)个物品卖,要按列表顺序买齐这M个物品,并且这N个物品在街道上也是有顺序的,求最小花费是多少。

用d[i][j]表示当前买了列表的前i个物品并且走完了街道的前j个摊子的最小花费,那么分两种情况,如果第j个摊子卖的和在列表上第i个商品相同,那么可能从d[i-1][j-1]推来或d[i][j-1],即第j个摊子买或不买,若第j个摊子卖的不是列表上的第i个商品,那么就直接由d[i][j-1]推来。

程序中用滚动数组从而在空间上压缩了一维状态。

状态转移方程:

d[i][j]=d[i][j-1](a[i].num!=b[j].num)

d[i][j]=max { d[i-1][j-1]+b[j].pri,d[i][j-1] }(a[i].num==b[j].num)

#include<cstdio>
#include<vector>
using namespace std;
int a[110];
int b[100010];
double c[100010];
double d[110];
vector<int> G[100010];
int main(void)
{
	int i,j,v,p,n,m;
	double q;
	scanf("%d%d",&n,&m);
	while((n!=0)||(m!=0))
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		for(i=1;i<=n;i++)
		{
			G[a[i]].push_back(i);
		}
		for(i=1;i<=m;i++)
		{
			scanf("%d%lf",&b[i],&c[i]);
		}
		d[0]=0;
		for(j=1;j<=n;j++)
		{
			d[j]=-10000;
		}
		for(i=1;i<=m;i++)
		{
			p=G[b[i]].size();
			if(p!=0)
			{
				for(j=p-1;j>=0;j--)
				{
					v=G[b[i]][j];
					q=-10000;
					if((int)(1000*d[v-1])>=0)
					{
						q=d[v-1]+c[i];
					}
					if((int)(1000*q)>=0)
					{
						if((int)(1000*d[v])<0)
						{
							d[v]=q;
						}
						else if(q<d[v])
						{
							d[v]=q;
						}
					}
				}
			}
		}
		if((int)(1000*d[n])<0)
		{
			printf("Impossible\n");
		}
		else
		{
			printf("%.2f\n",d[n]);
		}
		for(i=1;i<=n;i++)
		{
			G[a[i]].clear();
		}
		scanf("%d%d",&n,&m);
	}
	return 0;
}
时间: 2024-10-14 05:11:30

POJ 1297-Supermarket(DP)的相关文章

POJ 3034 Whac-a-Mole(DP)

题目链接 题意 : 在一个二维直角坐标系中,有n×n个洞,每个洞的坐标为(x,y), 0 ≤ x, y < n,给你一把锤子可以打到地鼠,最开始的时候,你可以把锤子放在任何地方,如果你上一秒在(x1,y1),那下一秒直线移动到的整数点(x2,y2)与这个点的距离小于等于d,并且当锤子移动(x2,y2)这个点时,所有在两点的直线上的整点数都可以打到.例如(0,0)移动到(0,3).如果(0,1),(0,2)有老鼠出现就会被打到.求能够打的最多老鼠. 思路 : Dp[i][j][k]代表点(i,j)

poj - 1722 - SUBTRACT(dp)

题意:一个长为 N (1 <= N <= 100)的序列(1 <= ai <= 100),一次操作为删除 a[i] 和 a[i + 1],然后将它们的差(a[i] - a[i + 1])放入该位置,问 N - 1 次操作后得到 T (-10000 <= T <= 10000)的操作顺序是什么? 题目链接:http://poj.org/problem?id=1722 -->>每次操作相当于给 a[i] 和 a[i + 1] 加括号做减法,那么把所有的括号去掉后

poj 1745 Divisibility(DP)

最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大. Input 输入数据的第一行为一个正整数T,表示有T组测试数据.每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y

poj - 1088 - 滑雪(dp)

题意:一个R * C的矩阵(1 <= R,C <= 100),元素代表该点的高度h(0<=h<=10000),从任意点出发,每次只能走上.下.左.右,且将要到的高度要比原高度小,求最长路. 题目链接:http://poj.org/problem?id=1088 -->>设dp[i][j]表示从ij位置出发的最长路,则状态转移方程为: dp[x][y] = max(dp[x][y], Dp(nNewX, nNewY) + 1); 时间复杂度:O(R * C) #inclu

POJ 1440-Varacious Steve(DP)

题目大意:Steve和Digit轮流取甜甜圈,有n个,每次不能取超过m个(1<=m<=n<=100),他们游戏的规则是,Steve先取,每个人取了之后甜甜圈就放在自己那里,当某个人取完最后一个以后,他吃掉自己那里的甜甜圈并把对手的所有甜甜圈拿出来,重复这样的过程,当一个人吃掉那对手的出来后,那一轮游戏是对手先手,求Steve能吃到的最多的甜甜圈. 用d[i][j][u][0]表示目前总共有i个甜甜圈,其中j个还未被取,u个在Steve处,且下一步到Steve走时,Steve能吃到的最多的

POJ 2192 Zipper (dp)

链接: http://poj.org/problem?id=2192 题意:就是给定三个字符串A,B,C:判断C能否由AB中的字符组成,同时这个组合后的字符顺序必须是A,B中原来的顺序,不能逆序:例如:A:mnl,B:xyz:如果C为mnxylz,就符合题意:如果C为mxnzly,就不符合题意,原因是z与y顺序不是B中顺序. DP求解:定义dp[i][j]表示A中前i个字符与B中前j个字符是否能组成C中的前 (i+j) 个字符,如果能,标记1,如果不能,标记0: 有了这个定义,我们就可以找出状态

poj 3230 Travel(dp)

Description One traveler travels among cities. He has to pay for this while he can get some incomes. Now there are n cities, and the traveler has m days for traveling. Everyday he may go to another city or stay there and pay some money. When he come

POJ 2948 Martian Mining(DP)

题目链接 题意 : n×m的矩阵,每个格子中有两种矿石,第一种矿石的的收集站在最北,第二种矿石的收集站在最西,需要在格子上安装南向北的或东向西的传送带,但是每个格子中只能装一种传送带,求最多能采多少矿. 思路 :记忆化搜索.也可以用递推. //2948 #include <stdio.h> #include <string.h> #include <iostream> using namespace std ; int yeye[510][510] ,blog[510]

【POJ 3071】 Football(DP)

[POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted: 2222 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all tea

【POJ 2029】 Get Many Persimmon Trees(DP)

[POJ 2029] Get Many Persimmon Trees(DP) Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4024   Accepted: 2628 Description Seiji Hayashi had been a professor of the Nisshinkan Samurai School in the domain of Aizu for a long time in the 18