您的位置:首页 > 其它

poj 3486 Computers dp的思想

2013-08-30 16:59 337 查看
这个让我想起了数塔。题目链接

这个可以直接这样做

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法