题意:有不同等级的珍珠,价格不同,现在列出需要买的珍珠,求花的最少的钱(可以买高等级的来代替低等级的)
分析:dp[i]表示从最低等级到 i 等级花的最少的钱,dp[i]=min(dp[j]+v) v是从j+1到i全买i等级花的钱。需要三重循环。
代码:
#include<iostream> #include<algorithm> #include<cstdio> #define INF 1000000007 using namespace std; int t,n; int a[2000],b[2000]; int dp[2000]; int min(int p,int q) { return p<q?p:q; } int DP() { for(int i=0;i<=n;i++) dp[i]=INF; dp[0]=0; for(int i=1;i<=n;i++){ for(int j=0;j<i;j++){ int v=0; for(int k=j+1;k<=i;k++) v+=a[k]; v=(v+10)*b[i]; dp[i]=min(dp[j]+v,dp[i]); } } return dp[n]; } int main() { cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; cout<<DP()<<endl; } }
原文地址:http://blog.csdn.net/ac_0_summer/article/details/46494925