标签: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; }
标签:turn min poj scanf 最优 状态 stream 就是 解释
原文地址:https://www.cnblogs.com/LYFer233/p/12884322.html