题目描述
给一条钢管,切割成不同长度的钢管(也可以不切割),不同的钢管长度对应不同的价值,求这根钢管获得的最大价值。
输入
第一行包含一个正整数L,为钢管的长度。
第二行包含L个正整数a1…aL,为长度从1到L的钢管对应的价值。
输出
输出一行,为钢管能获得的最大价值。
输入样例1
5
1 2 4 8 16
输出样例1
16
输入样例2
5
1 10 14 8 16
输出样例2
24
数据范围与约束
1<=a,L<=10000
思路分析
对于长度为L的钢管,把它分割成L个子问题,每一个长度为i(1<=i<=L)的子钢管为一个子问题。
对于每一个长度为i的钢管,从j处切割,遍历j从1到i,左边不再切割,右边可以进行切割,找最大的切割方式
AC代码
#include<stdio.h>
int value[10010];
int dp[10010]={0};
int max(int a,int b);
void cut_rod(int value[],int l);
int main()
{
int i,l;
scanf("%d",&l);
for(i=1;i<=l;i++)
scanf("%d",&value[i]);
cut_rod(value,l);
printf("%d",dp[l]);
return 0;
}
void cut_rod(int value[],int l)
{
int i,j,q;
for(i=1;i<=l;i++)
{
q=-1;
for(j=1;j<=i;j++)
q=max(q,value[j]+dp[i-j]);
dp[i]=q;
}
}
int max(int a,int b)
{return a>b?a:b;}