uva 10003 Cutting Sticks (动态规划:区间DP)
2018-01-18 16:19
543 查看
Cutting Sticks |
Input
The input will consist of several input cases. The first line of each test case will contain a positive number l that represents the length of the stick to be cut. You can assume l < 1000. The next line will contain the number n (n < 50) of cuts to be made.The next line consists of n positive numbers ci ( 0 < ci < l) representing the places where the cuts have to be done, given in strictly increasing order.An input case with l = 0 will represent the end of the input.Output
You have to print the cost of the optimal solution of the cutting problem, that is the minimum cost of cutting the given stick. Format the output as shown below.Sample Input
100 3 25 50 75 10 4 4 5 7 8 0
Sample Output
The minimum cutting is 200. The minimum cutting is 22.
题目意思 : 有一根长度为l的木棍,木棍上面有m个切割点,每一次切割都要付出当前木棍长度的代价,问怎样切割有最小代价
思路:
方法一 区间DP
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <set>
using namespace std;
#define MAXN 55
int len , m;
int dp[MAXN][MAXN];
int cut[MAXN];//记录切割点
void solve(){
int i , j , k , p , tmp , min;
cut[0] = 0 ;
cut[m+1] = len; //增加切点,那么切点有0-m+1
memset(dp , 0 , sizeof(dp));
for(p = 1 ; p <= m+1 ; p++){//区间长度0-m+1
for(i = 0 ; i <= m+1-p ; i++){//区间起点0-m+1-p
j = i+p; min = 999999999;//j为终点
for(k = i+1 ; k < j ; k++){//枚举k ,注意是i+1
tmp = dp[i][k]+dp[k][j]+cut[j]-cut[i];//这个地方注意不是从k+1开始
if(tmp < min) min = tmp;//更新min
}
if(min != 999999999) dp[i][j] = min;//如果min有更新过则赋值给dp[i][j]
}
}
printf("The minimum cutting is %d.\n" , dp[0][m+1]);//答案就是0-m+1这个区间
}
int main(){
//freopen("input.txt" , "r" , stdin);
while(scanf("%d" , &len) && len){
scanf("%d",&m);
for(int i = 1;i <= m;i++)
scanf("%d",&cut[i]);
solve();
}
return 0;
}
方法二:记忆化搜索,对于一根长为len的木棍,从x处截断,则花费len,并把当前木棍截为(x,len-x)两段用记忆化搜索的方法就很好写dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+a[j]-a[i])
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#define maxn 1010
#define inf 0x7f7f7f7f
using namespace std;
int cut[maxn];
int dp[maxn][maxn];
int dfs(int i,int j){
if(dp[i][j]!=-1){
return dp[i][j];
}
if(i+1==j) return dp[i][j]=0;
dp[i][j]=inf;
int temp;
for(int k=i+1;k<j;k++) {
temp=dfs(i,k)+dfs(k,j)+cut[j]-cut[i];
dp[i][j]=min(dp[i][j],temp);
}
return dp[i][j];
}
int main(){
int n,len;
while(scanf("%d",&len) && len){
scanf("%d",&n);
cut[0]=0;
cut[n+1]=len;
for(int i=1;i<=n;i++) scanf("%d",&cut[i]);
memset(dp,-1,sizeof(dp));
printf("The minimum cutting is %d.\n",dfs(0,n+1));
}
return 0;
}
相关文章推荐
- UVA10003[Cutting Sticks] 区间动态规划模型
- Uva 10003-Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks (区间dp)
- UVA 10003 Cutting Sticks(区间 DP)
- UVa 10003 - Cutting Sticks(白书,区间DP)
- UVA 10003 - Cutting Sticks(区间DP)
- 例题9-9 UVA 10003 Cutting Sticks 切木棍(区间dp)
- UVA-10003 Cutting Sticks (区间DP)
- UVa 10003 Cutting Sticks(区间DP)
- UVA - 10003 - Cutting Sticks (区间DP)
- uva10003 - Cutting Sticks(区间dp)
- UVA - 10003 Cutting Sticks (区间dp)
- 【UVa 10003】【区间DP】Cutting Sticks【有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。】
- uva 10003 Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks 简单区间dp
- Uva 10003 Cutting Sticks (区间dp)
- UVa 10003 - Cutting Sticks 区间dp
- uva10003 - Cutting Sticks(DP,区间)
- UVa 10003 Cutting Sticks 超详细题解(区间DP经典)
- UVa 10003 - Cutting Sticks 区间dp