uva10003(经典区间dp)

本文深入解析了UVA10003题目,通过区间动态规划的方法解决小棒切割问题,详细阐述了状态转移方程及代码实现。

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

题面

uva10003

题意

在这里插入图片描述

思路

明显,对小棒ij中间k点来一刀,小棒就变成了ik,jk两个小棒,并且花费为j-i,很容易想到区间dp,用 d [ i ] [ j ] d[i][j] d[i][j]表示把小棒ij分到不能分为止最小的花费,那么得到状态转移方程:
d [ i ] [ j ] = m i n ( d [ i ] [ j ] , d [ i ] [ k ] + d [ j ] [ k ] + j − i ) d[i][j]=min(d[i][j],d[i][k]+d[j][k]+j-i) d[i][j]=min(d[i][j],d[i][k]+d[j][k]+ji)
所求的结果为 d [ 0 ] [ L ] d[0][L] d[0][L]

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
const int maxl = 1100;
const int inf = 0x3f3f3f3f;
int cut[maxn];
int d[maxl][maxl];
int main()
{
    int L;
    int n;
    int Case=0;
    while (cin >> L )
    {
        if(L==0) break;
        else cin>>n;
        Case++;
        memset(d, inf, sizeof(d));
        for (int i = 1; i <= n; i++)
            cin >> cut[i];
        cut[0] = 0;
        cut[n + 1] = L;
        for (int i = 2; i <= n; i++)
        {
            d[cut[i - 1]][cut[i]] = 0;
        }
        d[0][cut[1]] = 0;//这一块
        d[cut[n]][L] =0;//很细节
        cut[0] = 0;//可以多想想
        cut[n + 1] = L;//为什么这样搞
        for (int l = 3; l <= n+2; l++)
        {
            for (int i = 0; i <= n + 2 - l; i++)
            {
                for (int k = i + 1; k <= i + l - 2; k++)
                {
                    d[cut[i]][cut[i + l - 1]] = min(d[cut[i]][cut[i + l - 1]], d[cut[i]][cut[k]] + d[cut[k]][cut[i + l - 1]] + cut[i + l - 1] - cut[i]);
                }
            }
        }
        cout<<"The minimum cutting is "<<d[0][L]<<"."<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值