链接: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 ",dp[1]); 34 } 35 return 0; 36 }