题意:给你n个物品的数量和价格,单个购买物品时数量加10(买一个花11个钱),连续购买多个时,数量总和加10,以结束物品单价为准,求最小单价
思路:就是简单的n2dp,注意初始化为0x3f,而不是0,还有就是在选取第j个物品时的前缀时减pre[j-1]其他的就没有什么坑点了,斜率优化下次再更新
代码:
#include <bits/stdc++.h> using namespace std; const int maxn=105; int a[maxn],val[maxn],dp[maxn],pre[maxn]; int main() { int T; scanf("%d",&T); while(T--){ int n; memset(dp,0x3f,sizeof(dp)); scanf("%d",&n); pre[0]=0; for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&val[i]),pre[i]=pre[i-1]+a[i]; dp[0]=0; for(int i=1;i<=n;i++){ dp[i]=dp[i-1]+(a[i]+10)*val[i]; for(int j=1;j<i;j++){ dp[i]=min(dp[i],dp[j-1]+(pre[i]-pre[j-1]+10)*val[i]); } } printf("%d\n",dp[n]); } return 0; }