C2-Zexal的钢管切割

题目描述

在钢管切割的背景下,已经知道长度为1n的钢管的价值,给定长度为n的钢管在切割若干次(也可以不切割)所带来的最小价值是?

输入

多组数据输入

第一行一个整数n,为起始钢管长度(0<n1000

第二行n个整数,分别为长度为i的钢管的价值ti0<ti10^6

输出

对于每组数据,输出一行,为这根钢管所带来的最小价值T

输入样例

3
2 3 7

输出样例

 5

Hint

算法导论第三版15.1节

转移方程

dp[i] = min(dp[i-j] + dp[j], dp[i]);

代码

#include <iostream>
#include <stdio.h>
using namespace std;
long long n,dp[1003];
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i = 1; i <= n; i++)
        {
            scanf("%d",&dp[i]);
        }
        for(int i = 1; i <= n; i++)
            for(int j = 1; j < i; j++)
                dp[i] = min(dp[i-j] + dp[j], dp[i]);
        printf("%d
",dp[n]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kubab119/p/11823254.html