码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3486 Computers

时间:2020-05-13 20:28:30      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:turn   min   poj   scanf   最优   状态   stream   就是   解释   

题意:

要求n年中每年你都要有电脑可用,每年你都可以选择购买一台新电脑,其固定费用是C。同时维护这台电脑从当前第X年到第Y年的总费用是m(X,Y)  (也就是在第X年到第Y年内不需要再花费别的钱维护或者购置)。问最少花费多少才能满足要求。

题目数据多组,先输入费用C,之后输入n,之后输出n行。

思路:

这个题意读了半小时一直没理解,看了一些博客的题意解释,感觉就是千篇一律。

最后冥思苦想,样例原来是这样的, 第一年购买电脑花费3,之后只维护一年m(1,1)=5再花费5.第二年购买电脑花费3,从第二年维护到第三年花费m(2,3)=8。

也就是你每年只需要决定当前购买电脑不? 购买的话维护多少年?

状态就按每年的时间划分,那么状态就很明确了dp[i]表示在前i年拥有电脑的最小花费。 那么接下来就要思考如何转移?

最好的思路就是枚举上次购买电脑的时间j,因为在第j年购买所以维护费用就是 m(j,i) 同时前j-1年的费用已经满足最优解。

故dp方程为 dp[i] = dp[j - 1] + Day[j][i] + c (j <= i)

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

int n, cost;
int Day[1005][1005];
int dp[1005];

int main(){
    while(scanf("%d", &cost) != EOF){
        scanf("%d", &n);
        memset(dp, 0x3f, sizeof(dp));
        
        for(int i = 1; i <= n; i++){
            for(int j = i; j <= n; j++){
                scanf("%d", &Day[i][j]);
            }
        }
        
        dp[0] = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= i; j++){
                dp[i] = min(dp[i], dp[j - 1] + Day[j][i] + cost);
            }
        }
        printf("%d\n", dp[n]);
    }
    return 0;
}

 

POJ 3486 Computers

标签:turn   min   poj   scanf   最优   状态   stream   就是   解释   

原文地址:https://www.cnblogs.com/LYFer233/p/12884322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!