这个让我想起了数塔。题目链接
这个可以直接这样做
3 3 5 7 50 6 8 10这个样例记录的是 机器的成本 机器的年份,和
(1,1),(1,2),(1,3)
(2,2),(2,3)
(3,3)
这所需要维修花费的成本。
简单的对数据进行处理,编程单年的费用
然后我们就可以变成如下的结果
第一年初维修费用 5
第二年初维修费用 2 6
第三年出维修费用 43 2 10
然后计算金额是这样的,从第一列开始,从开头走到结束在加上机器成本,若中间 又新买了机器,注意要跳列,
例如有这样的选择 3 + 5 + 2 +3+10 机器的费用+第一年的费用+第二年的费用+新机器的费用+第三年新机器的维修费用
答案是这样进行的 3+5+3+6+2=19 机器的费用+第一年的费用+新机器的费用+新买机器第二年机器的维修费用+新买机器第三年的维修费用
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int a[1100][1100];
int MAX=100000000;
int main()
{
int base,t;
while(scanf("%d",&base)!=EOF){
scanf("%d",&t);
memset(a,0,sizeof(a));
for(int i=1;i<=t;i++)
for(int j=i;j<=t;j++){
scanf("%d",&a[j][i]);
}
for(int i=1;i<=t;i++)
for(int j=t+1-1;j>=1;j--){
a[j][i]=a[j][i]-a[j-1][i];
}
int min;
for(int i=1;i<=t;i++){
if(i==1){
a[i][i]+=base;
continue;
}
for(int j=1;j<i;j++){
a[i][j]=a[i-1][j]+a[i][j];
}
min=MAX;
for(int k=1;k<i;k++){
if(a[i-1][k]<min)min=a[i-1][k];
}
a[i][i]=a[i][i]+min+base;
}
min=MAX;
for(int i=1;i<=t;i++){
//cout<<t<<" "<<a[t][i]<<endl;
if(min>a[t][i])min=a[t][i];
}
cout<<min<<endl;
}
return 0;
}