思路:
DP题型一般找状态转移方程考虑应从整体出发,到局部,再通过最优子结构到整体最优,其次就是边界问题的考虑,一般是从底向上考虑,得出边界。
此题最主要的考虑是不能跳跃的用质量大的珠宝来代替质量小的珠宝,只能连续的代替;
AC代码:
#include<stdio.h> #define inf 0x3f3f3f3f struct node { int ai; int pi; }a[101]; int dp[101]; int sum[101]; int main() { int T; int c; int i,j; int min; scanf("%d",&T); while(T--) { scanf("%d",&c); sum[0]=0; for(i=1;i<=c;i++) { scanf("%d%d",&a[i].ai,&a[i].pi); sum[i]=sum[i-1]+a[i].ai; } dp[0]=0; for(i=1;i<=c;i++) { min=inf; for(j=0;j<i;j++) if(min>dp[j]+(sum[i]-sum[j]+10)*a[i].pi) min=dp[j]+(sum[i]-sum[j]+10)*a[i].pi; dp[i]=min; } printf("%d\n",dp[c]); } return 0; }