POJ1260 Pearls DP

来源:互联网 发布:陕西干部网络培训答案 编辑:程序博客网 时间:2024/05/20 19:47

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;}


原创粉丝点击