问题描述:
一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。如一个Pi如下:
1.数据结构表示DAG,我们可以把它想象成DAG,每个长度想象成一个点,i>j 则i可以指向j,代价为上图(i-j)对应数值,结果就是求最长路径。
2.问题小化,即求出前面节点的最长路径,就可以求出n点的最长路径了,详见之前我的另一文章.
3.数据结构表示,我们用dp[i] 来存储i的最大收益值,last[i]存储i节点切割的最后一次长度。
4.代码实现,算法复杂度O(n^2),不知道有没有什么更快的算法,求大神解读
#include <stdio.h>
int map[10000][10000];
int dp[10000];
int last[10000];
int main(){
int n=0;
while (scanf("%d", &n)!=EOF){
memset(map, 0, sizeof(map));
memset(dp, 0, sizeof(dp));
memset(last, 0, sizeof(last));
dp[0] = 0;
for (int i = 1; i <=n; i++){
scanf("%d", &dp[i]);
dp[i] = dp[i];
last[i] = i;
for (int j = i; j >0; j--){
map[i][i - j] = dp[j];
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= i; j++){
if (dp[j] + map[i][j] > dp[i]){
dp[i] = dp[j] + map[i][j];
}
}
}
printf("%d\n", dp[n]);
}
return 0;
}