題目大意:有 n 種珍珠,第 i 種需購買 num[i] 顆,單價 price[i]。採購規則:每次下單某種珍珠,數量必須在原需求基礎上 +10。可選擇用更高品質(更貴)珍珠替代低品質需求。求最小總成本。
定義 dp[i] = 滿足前 i 種珍珠需求的最小成本。
狀態轉移:最後一批採購覆蓋第 j+1 到 i 種珍珠(j < i),全部按第 i 種(最高價)採購。
dp[i] = min_{0≤j
其中 sum[i] = Σ_{k=1..i} num[k] 為前綴和。
初始 dp[0] = 0,答案 dp[n]。
struct Pearl { int num, price; } p[105];
int dp[105], sum[105];
int main() {
int T; scanf("%d", &T);
while (T--) {
int n; scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].num, &p[i].price);
sum[0] = 0;
for (int i = 1; i <= n; i++) sum[i] = sum[i-1] + p[i].num;
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j < i; j++)
dp[i] = min(dp[i], dp[j] + (sum[i] - sum[j] + 10) * p[i].price);
printf("%d\n", dp[n]);
}
return 0;
}