# uva:10003 - Cutting Sticks

#include<iostream>
#include<stdio.h>
#include<string.h>

using namespace std ;

const int INF = 1000000 ;

int num[55][55] ;
int len[55] ;
int n ;
int length ;

int dp(int  , int ) ;
int dist(int , int) ;

int main()
{
//	freopen("in.txt" , "r" , stdin) ;
while(cin>>length && length)
{
int i ;
int temp ;
int k ;

temp = 0 ;
scanf("%d" , &n) ;
//转化为段存储，每一段的长度可以求出
for(i = 0 ; i < n ; i ++)
{
scanf("%d" , &len[i]) ;

k = len[i] ;

len[i] = len[i] - temp ;

temp = k ;
}
len[i] =  length - temp ;

for(i = 0 ; i <= n ; i ++)
{
for(int j = 0 ; j <= n ; j ++)
{
num[i][j] = INF ;
}
}
cout<<"The minimum cutting is ";
cout<<dp(0 , n)<<"."<<endl ;
}
return 0 ;
}

int dp(int left , int right)//记忆化搜索
{
if(left==right)
return 0 ;

int & ans = num[left][right] ;

if(ans < INF)
return ans ;

for(int i = left ; i <= right ; i ++)
{
if(ans > dp(left , i) + dp(i+1 , right) + dist(left , right) )
ans = dp(left , i) + dp(i+1 ,right) + dist(left , right) ;
}

return ans ;
}

int dist(int i , int j)//求这一区间的总和
{
int sum = 0 ;

while(i <= j)
{
sum += len[i] ;
i ++ ;
}

return sum ;
}

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
const int INF = 1000000 ;

int num[55][55] ;
int len[55] ;
int n ;
int length ;

int dist(int , int );

int main()
{
//freopen("uva10003.txt" , "r" , stdin) ;

int i ;
int j ;
int k ;
int temp ;

while(cin>>length && length)
{
temp = 0 ;
scanf("%d" , &n) ;

for(i = 0 ; i < n ; i ++)
{
scanf("%d" , &len[i]) ;

k = len[i] ;

len[i] = len[i] - temp ;

temp = k ;
}

len[i] =  length - temp ;

for(i = 0 ; i <= n ; i ++)
{
for(j = 0 ; j <= n ; j ++)
{
if(i!=j)
num[i][j] = INF ;
else
num[i][j] =  0  ;
}
}

for(temp = 0 ; temp <= n ; temp ++)//表示j-i的值，从0到n
{

for(i = 0 ; i <= n - temp ; i ++)
{
j = i + temp ;

for(k = 0 ; k <= j ; k ++)
{
if(num[i][j] > num[i][k] + num[k+1][j] + dist(i , j))
num[i][j] = num[i][k] + num[k+1][j] + dist(i , j) ;
}
}
}

printf("The minimum cutting is %d.\n" , num[0][n]) ;
}
return 0;
}

int dist(int i , int j)
{
int sum = 0 ;

while(i <= j)
{
sum += len[i] ;
i ++ ;
}

return sum ;
}


• 本文已收录于以下专栏：

## UVa 10003 - Cutting Sticks

• mobius_strip
• 2014年09月15日 10:30
• 911

## UVa 10003Cutting Sticks

• u014696011
• 2014年08月02日 19:50
• 430

## Uva | Cutting Sticks

• u013033845
• 2016年08月17日 16:45
• 506

## uva 10003 - Cutting Sticks

• u010652938
• 2014年08月07日 21:04
• 222

## UVA 10003 cutting sticks

• Yuta233
• 2018年01月22日 22:59
• 37

## UVA 10003 Cutting sticks

#include #include #include using namespace std; #define maxn 100000 int p[55],dp[55][55]; int m...
• DoJintian
• 2014年11月09日 22:19
• 365

## UVA - 10003 - Cutting Sticks

• TSTNOE
• 2018年02月06日 22:16
• 31

## UVa:10003 Cutting Sticks

• kkkwjx
• 2013年09月01日 09:28
• 454

## UVA - 10003 Cutting Sticks

• u011345136
• 2013年09月06日 20:19
• 625

## Cutting Sticks UVA - 10003

• zju2016
• 2017年09月13日 20:41
• 47

举报原因： 您举报文章：uva:10003 - Cutting Sticks 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)