題意:
給出幾類珍珠,以及它們的單價,要求用最少的錢就可以買到相同數量的,相同(或更高)品質的珍珠。
規定買任一類的珍珠n個(價格為p),都要支付(n+10)*p的錢,即額外支付10*p。
(1) 要求要買的珍珠的數量是一定的
(2) 所買的珍珠的品質允許提高,但不允許下降(即可以用高品質珍珠替代低品質)
(3) 輸入時,後輸入的珍珠價格一定比前面輸入的要貴
(4) 由(2)(3)知,珍珠的替代必須是連續的,不能跳躍替代。因為,假如方案是用第 i+2 類去替代第 i 類珍珠,而用第 i+1 類去替代第 i 類珍珠會使最終的支付價格更加低;所以,一定是因為第 i+2 類代替了第 i+1 類後會使最終的支付價格更低而使第i類直接被第
i+2 類代替。由此遞推得出,若第 i 類被第 j 類代替,那麼 i 和 j 之間的所有類都會被第j類代替。
令f[i]表示在已知第i類珍珠時,所需支付的最低價格
則狀態方程為:
f[i]=(a[i]+10)*p[i]+f[i-1]; //當第i種珍珠出現時,未最佳化價格的情況
f[i]=min(f[i],(sum[i]-sum[j]+10)*p[i]+f[j]); //枚舉j,價格最佳化
f[0]=0; //初始化
// Time 0ms; Memory 220K
#include<iostream>using namespace std;int main(){int i,j,t,n,a[110],sum[110],p[110],f[110];cin>>t;while(t--){cin>>n;sum[0]=0;for(i=1;i<=n;i++){cin>>a[i]>>p[i];sum[i]=sum[i-1]+a[i];}f[0]=0;for(i=1;i<=n;i++){f[i]=f[i-1]+(a[i]+10)*p[i];for(j=0;j<i-1;j++) if(f[i]>f[j]+(sum[i]-sum[j]+10)*p[i]){f[i]=f[j]+(sum[i]-sum[j]+10)*p[i];}}cout<<f[n]<<endl;}return 0;}