hdu 1300 Pearls

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300

思路:用dp[i]表示前i种花费最低的情况,则有dp[i]=min(dp[i],dp[j+1]+((sum[i]-sum[j+1]+10)*p[j])

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 int a[1005],dp[1005],sum[1005],p[1005];
14 
15 int main()
16 {
17     int cas,n;
18     scanf("%d",&cas);
19     while(cas--)
20     {
21         scanf("%d",&n);
22         for(int i=1;i<=n;i++)
23             scanf("%d %d",&a[i],&p[i]);
24         sum[0]=sum[n+1]=0;
25         for(int i=n;i>=1;i--)
26             sum[i]=sum[i+1]+a[i];
27         dp[n+1]=0;
28         for(int i=1;i<=n;i++)
29             dp[i]=99999999;
30         for(int i=n;i>=1;i--)
31             for(int j=n;j>=i;j--)
32                 dp[i]=min(dp[i],dp[j+1]+(sum[i]-sum[j+1]+10)*p[j]);
33         printf("%d\n",dp[1]);        
34     }
35     return 0;
36  } 

 

posted @ 2016-08-11 10:14  pter  阅读(121)  评论(0编辑  收藏  举报