UVa 10003 Cutting Sticks

本文探讨了使用动态规划算法解决区间内最优解的问题。通过定义状态转移方程,逐步求解从起始到结束的最大或最小值。利用C++实现,通过实例展示了算法的应用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        简单DP题。dp(i,j)是i~j这个区间内的最优解,假设下一次在k处分割,dp(i,j)=min(dp(i,k)+dp(k,j))+len(i,j)。


#include <iostream>    
#include <stdio.h>    
#include <cmath>    
#include <algorithm>    
#include <iomanip>    
#include <cstdlib>    
#include <string>    
#include <memory.h>    
#include <vector>    
#include <queue>    
#include <stack>    
#include <map>  
#include <set>  
#include <ctype.h>    
#define INF 1000000  
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
  
using namespace std;  

int a[1010];
int dp[1010][1010];


int main(){
	int l;
	while(cin>>l){
		if(!l)break;
		
		memset(dp,0,sizeof(dp));
		int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		a[0]=0;a[n+1]=l;
		
		for(int i=2;i<=n+1;i++){
			for(int j=0;j+i<=n+1;j++){
				dp[j][i+j]=dp[j][j+1]+dp[j+1][i+j]+a[i+j]-a[j];
				for(int k=j+1;k<i+j;k++){
					dp[j][i+j]=min(dp[j][i+j],dp[j][k]+dp[k][i+j]+a[i+j]-a[j]);
				}
			}
		}
		printf("The minimum cutting is %d.\n",dp[0][n+1]);	
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值