您的位置:首页 > 其它

UVA10003 简单DP

2017-02-16 15:20 204 查看

题意

有一段长度为l的木棍,需要切割n次,切割点分别为c(1-n),每切割一次的费用为切割的木棍长度。求切割n次所需的最小费用。

题解

设dp[i][j]为i到j部分全部切割所需的最小费用,则可得状态转移方程dp[i][j]=min(dp[i][k]+dp[k][j]+p[j]-p[i],dp[i][j])。(p[i]为i点的位置)

注意事项

注意p[0]代表木棍起点初始化为0,p[n+1]代表木棍终点初始化为len

代码

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 1e9

using namespace std;
int dp[60][60],p[60];

int main()
{
int len;
int n;
while(scanf("%d",&len)){
if(len==0)
break;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&p[i]);
p[0]=0;
p[n+1]=len;
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
if(i==j+1||j==i+1){
dp[i][j]=0;
dp[j][i]=0;
}else{
dp[i][j]=INF;
dp[j][i]=INF;
}
}
}

for(int i=n+1;i>=0;i--){
for(int j=i+2;j<=n+1;j++){
for(int k=i+1;k<j;k++){
dp[i][j]=min(dp[i][k]+dp[k][j]+p[j]-p[i],dp[i][j]);
}
}
}
printf("The minimum cutting is %d.\n",dp[0][n+1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: