The Poor Giant (区间dp)

本文介绍了一道经典的动态规划问题——寻找最甜苹果的最优解。问题要求在一系列具有特定重量的苹果中找到唯一的甜苹果,通过动态规划算法求解不同情况下的最小总重量。

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



    点击打开链接

        题意:给N个苹果,重量为 K+1,  K+2, K+3,......K+N。

        苹果中有1个甜的,其他比这个重的都是酸的,比这个轻的都是苦的。让求甜的分别为#1, #2, 。。。。 #N 号苹果时,要品尝的苹果的重量最少为多少。

         这里用dp[i][j]表示【i,j】区间的苹果的最小值,那么可以的到一个dp公式:dp[i][j]= dp[i][k-1]+dp[k+1][j]+len*(k+K),区间dp即可。

代码:

#include<iostream>
#include<cstring>
using namespace std;
int dp[510][510];
const int INF=1e9;
int main()
{
    int T, N, K;
    cin>>T;
    int cnt=1;
    while(T--)
    {
        cin>>N>>K;
        memset(dp, 0, sizeof(dp));
        for(int len=1; len<=N; len++)     //区间长度
        {
            for(int i=K+1; i<=K+N; i++)  // 【i,i+len】
            {
                if(i+len>K+N)
                    continue;
                dp[i][i+len]=INF;
                for(int j=i; j<=i+len; j++)
                {
                    int temp=dp[i][j-1]+dp[j+1][i+len]+j*(len+1);
                        // 这里 j*(len+1)
                        // j 即为苹果重量, (len+1)是苹果个数
                    dp[i][i+len]=min(dp[i][i+len], temp);
                }
            }
        }
        cout<<"Case "<<cnt++<<": "<<dp[K+1][N+K]<<endl;
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值