uva 10003 cutting sticks

本文通过动态规划的方法解决了一个关于绳子切割的问题。利用二维数组dp记录子问题的最优解,通过逐步扩大问题规模的方式找到全局最优解。该文详细展示了如何初始化dp数组并迭代求解的过程。

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

最近动态规划真的是让人头疼,但是越是难的东西越要坚持!先从简单的开始,一点一点地努力,DP基础题。思路就是和刘大爷的一致。

#include <iostream>
#include <cstring>

using namespace std;

int l,n;
int p[60];
int dp[60][60];
const int inf = 0x3f3f3f3f;

void solve () {
    for (int i = 0 ; i <= n-1 ; i++) 
        dp[i][i+2] = p[i+2] - p[i];
    for (int i = 0 ; i <= n ; i++)
        dp[i][i+1] = 0;

    for (int s = 3 ; s <= n+1 ; s++) {
        for (int i = 0 ; i <= n+1-s ; i++) {
            for (int j = i+1 ; j < i+s ; j++) {
                dp[i][i+s] = min(dp[i][i+s] , dp[i][j]+dp[j][i+s]+p[i+s]-p[i]);
            }
        }
    }
}

int main () {
    while (cin >> l) {
        if (!l) return 0;

        cin >> n;
        memset(dp,inf,sizeof(dp));
        memset(p,0,sizeof(p));
        p[0]=0 ; p[n+1]=l;
        for (int i = 1 ; i <= n ; i++)
            cin >> p[i];
        solve();
        cout << "The minimum cutting is " << dp[0][n+1] << "." << endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值