Problem Address:http://poj.org/problem?id=1260
【思路】
转移方程:dp[i] = min(dp[i-k]+(a[i-k+1]+a[i-k+2]+...+a[i]+10)*p[i]),1<=k<=i,1<=i<=c。
dp[0] = 0。
可以用数组s[i]记录a[1]+a[2]+...+a[i]的值,则a[i-k+1]+a[i-k+2]+...+a[i] = s[i] - s[i-k],避免重复计算。
【代码】
#include <iostream>
using namespace std;
const int maxn = 100;
int a[maxn+5];
int p[maxn+5];
int s[maxn+5];
int dp[maxn+5];
int main()
{
int t;
int n;
int i, j;
int min, temp;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for (i=1; i<=n; i++) scanf("%d %d", &a[i], &p[i]);
s[0] = 0;
for (i=1; i<=n; i++) s[i] = s[i-1] + a[i];
dp[0] = 0;
for (i=1; i<=n; i++)
{
min = INT_MAX;
for (j=1; j<=i; j++)
{
temp = dp[i-j] + (s[i] - s[i-j] + 10) * p[i];
if (temp<min) min = temp;
}
dp[i] = min;
}
printf("%d\n", dp[n]);
}
return 0;
}