您的位置:首页 > 其它

HDU 1300 POJ 1260 Pearls (DP)

2015-07-30 10:46 495 查看
思路:设dp[i]为考虑前i个珍珠的最小花费。

那么枚举用第i个珍珠所代替的珍珠(其所替换的必定是一段连续的区间)得到方程dp[i] = min(dp[i],dp[j] + cost(j+1,i))。

这个题可以用斜率优化来降低复杂度。

我的代码:

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int maxn = 505;

int dp[maxn],n,a[maxn],p[maxn];

int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&p[i]);
}
memset(dp,63,sizeof(dp));
dp[0] = 0;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
int ans = dp[j];
for(int k=j+1;k<=i;k++) ans += a[k]*p[i];
dp[i] = min(dp[i],ans+10*p[i]);
}
}
printf("%d\n",dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: