poj 1260 Pearls
#include <iostream> //DP
#include <numeric>
using namespace std;
#define ed 105
int ai[ed],pi[ed],dp[ed];
int main()
{
int t,c;
cin>>t;
while(t--)
{
cin>>c;
for(int i=1;i<=c;++i)
cin>>ai[i]>>pi[i];
fill(dp,dp+ed,100000000); //初始化为极大值
dp[0]=0;
for(int i=1;i<=c;++i) //dp[i]表示前i种Pearls的最小费用,dp[c]即为最优解
for(int j=1;j<=i;++j)
dp[i]=min(dp[i],accumulate(&ai[j],&ai[i+1],10)*pi[i]+dp[j-1]); //accumulate(&ai[j],&ai[i+1],10)返回的是ai[j]+...+ai[i]+10,表示第j...i-1种珍珠都用第i种珍珠代替
cout<<dp[c]<<endl;
}
return 0;
}
//较低等级的珍珠如果要合并到较高等级的珍珠,应该是全部被合并这一等级上,而不能被拆成几部分再合并到不同等级上
//用较高等级的珍珠代替较低等级的珍珠必须是连续代替,比如价格200的等级要替代价格100的等级,
//那么不能跳跃中间的等级,所以应是100及以上的等级(100<p<200)都要被价格200的等级所替代