很明显的,当vi<vj<vk且i可以用j来代替(即(si+10)*vi<si*vj)时,则当前解为最优解(因为si*vj<si*vk - -...)。
用dp[j]表示前j种pearl的最小代价,i>j&i=1...n,dp[1]=(s1+10)*v1,用第i种pearl替代前i-j种,得状态转移方程:
dp[i] = min(dp[j] + (sum[i]-sum[j]+10)*val[i]) ;
代码:
#include<cstdio>
int sum[1001], val[1001], dp[1001] ;
int main(){
int t, i, j, n, min ;
scanf("%d", &t) ;
while(t--){
scanf("%d", &n) ;
sum[0] = dp[0] = 0 ;
for(i=1; i<=n; i++){
scanf("%d%d", &j, &val[i]) ;
sum[i] = sum[i-1] + j ;
}
for(i=1; i<=n; i++){
min = 2147483647 ;
for(j=0; j<i; j++){
dp[i] = dp[j] + (sum[i]-sum[j]+10)*val[i] ;
if(dp[i]<min) min = dp[i] ;
}
dp[i] = min ;
}
printf("%d\n", dp[n]) ;
}
return 0 ;
int sum[1001], val[1001], dp[1001] ;
int main(){
int t, i, j, n, min ;
scanf("%d", &t) ;
while(t--){
scanf("%d", &n) ;
sum[0] = dp[0] = 0 ;
for(i=1; i<=n; i++){
scanf("%d%d", &j, &val[i]) ;
sum[i] = sum[i-1] + j ;
}
for(i=1; i<=n; i++){
min = 2147483647 ;
for(j=0; j<i; j++){
dp[i] = dp[j] + (sum[i]-sum[j]+10)*val[i] ;
if(dp[i]<min) min = dp[i] ;
}
dp[i] = min ;
}
printf("%d\n", dp[n]) ;
}
return 0 ;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步