hdu 1300 Pearls(DP)
题意:
有N种【价格从低到高】珍珠,每种珍珠有一个价格。每种珍珠有一个需要的个数。
如果你决定买某种珍珠x个,则需要额外多买10个。【防止游客购买少量】
你可以把低价格的珍珠换成高价格的珍珠,但不允许把高价格的珍珠换成低价格的珍珠。
问总共最少需要花多少钱。
思路:
假设第 i 种珍珠需要X个。可以知道要么这X个用这个价格买,要么就归到更高价格的珍珠里去买。【想想就明白了】
也就是,有的珍珠0个,有的珍珠好多。也就是某个珍珠种类的前k种珍珠都归到这个珍珠种类去买。
DP结构出来了。
dp[i]:前 i 种珍珠,第 i 种珍珠要买若干个所花的最少钱是多少。
dp[i]=max( dp[i],dp[j]+(sum[i]-sum[j-1]+10)*p[i] )
代码:
int n; int sum[105], num[105], p[105]; int dp[105]; int main(){ int T; cin>>T; while(T--){ scanf("%d",&n); sum[0]=0; rep(i,1,n){ scanf("%d%d",&num[i],&p[i]); sum[i]=sum[i-1]+num[i]; } mem(dp,inf); dp[0]=0; rep(i,1,n){ rep(j,0,i-1){ dp[i]=min( dp[i],dp[j]+(sum[i]-sum[j]+10)*p[i] ); } } printf("%d\n",dp[n]); } return 0; }