[DP] poj1260

/*
题意:已知每种珍珠需要几个,花费多少
买珍珠的花费为(need[x1]+need[x2]+...+10)*max(cost[x1],cost[x2],....) 
10为定值
求买完所有珍珠最小的花费
*/
import java.math.*;
import java.util.*;
import java.io.*;
public class Main 
{
	static int min(int a,int b){return (a<b)? a:b;}
	static int max(int a,int b){return (a>b)? a:b;}
	static Node a[]=new Node[110];
	static class Node
	{
		public 
		int c,val;
		Node(){}
		Node(int a,int b){c=a;	val=b;	return ;}
	};
	static int qs(int h,int t)
	{
		int k=h,tmp=0;
		for(int i=h;i<t;i++)
		{
			if(a[i].val<a[t].val)
			{
				tmp=a[i].c;
				a[i].c=a[k].c;
				a[k].c=tmp;
				tmp=a[i].val;
				a[i].val=a[k].val;
				a[k].val=tmp;
				k++;
			}
		}
		tmp=a[t].c;
		a[t].c=a[k].c;
		a[t].c=tmp;
		tmp=a[t].val;
		a[t].val=a[t].val;
		a[t].val=tmp;
		return k;
	}
	static void px(int h,int t)
	{
		if(h<t)
		{
			int mid=qs(h, t);
			px(h, mid-1);
			px(mid+1, t);
		}
		return;
	}
	public static void main(String args[])
	{
		Scanner cin=new Scanner(System.in);
		int T=cin.nextInt();
		int sum[]=new int[120];
		int dp[]=new int [120];
		while(T-->0)
		{
			int n=cin.nextInt();
			for(int i=1;i<=n;i++)
			{
				a[i]=new Node();
				int x,y;
				x=cin.nextInt();y=cin.nextInt();
				a[i].c=x;
				a[i].val=y;
			}
			px(1,n);
			sum[0]=0;
			for(int i=1;i<=n;i++)
			{
				dp[i]=-1;
				sum[i]=sum[i-1]+a[i].c;
			}
			dp[0]=0;
			for(int i=1;i<=n;i++)
			{
				for(int j=0;j<i;j++)
					if(dp[i]==-1)
						dp[i]= dp[j]+(sum[i]-sum[j]+10)*a[i].val;
					else dp[i]=min(dp[i], dp[j]+(sum[i]-sum[j]+10)*a[i].val);
			}
			System.out.println(dp[n]); 
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值