ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC 251 | E - Takahashi and Animals

2022-06-06 09:34:21  阅读:136  来源: 互联网

标签:ABC Animals int include le 操作 251 若想 喂养


题意描述

Takahashi有\(N\)头牛,编号为\(1 \sim N\),他可以通过以下\(N\)种方式来喂养牛:

  • 花费\(A_1\)喂养牛\(1\)和牛\(2\)
  • 花废\(A_2\)喂养牛\(2\)和牛\(3\)
  • 花费\(A_3\)喂养牛\(3\)和牛\(4\)
  • ... ...
  • 花费\(A_{N - 1}\)喂养牛\(N - 1\)和牛\(N\)
  • 花费\(A_N\)喂养牛\(N\)和牛\(1\)

Takahashi的目标是使得每一头牛都被喂养,并使得花费最小,输出该最小花费。

数据范围

  • \(2 \le N \le 3 \times 10^5\)
  • \(1 \le A_i \le 10^9\)

题目解析

动态规划问题常用来解决最优化问题,而动态规划应用于这类问题的优势在于解决了重叠子问题,避免重复计算。动态规划算法的关键在于状态表示和状态转移。
首先对问题进行分析

  • 若想牛\(1\)被喂养,操作\(1\)和操作\(N\)需至少选择一个
  • 若想牛\(2\)被喂养,操作\(1\)和操作\(2\)需至少选择一个
  • 若想牛\(3\)被喂养,操作\(2\)和操作\(3\)需至少选择一个
  • ... ...
  • 若想牛\(N - 1\)被喂养,操作\(N - 2\)和操作\(N - 1\)需至少选择一个
  • 若想牛\(N\)被喂养,操作\(1\)和操作\(N\)需至少选择一个

状态表示
\(f[i][0]\)表示已对前\(i - 1\)个进行决策且第\(i\)个不选的最小费用.
\(f[i][1]\)表示已对前\(i - 1\)个进行决策且第\(i\)个选的最小费用.

状态转移
\(f[i][0] = f[i - 1][1]\)
\(f[i][1] = \min(f[i - 1][0], f[i - 1][1]) + a[i]\)

边界条件及问题答案

  • 若不进行操作\(1\)
    \(f[1][0] = 0, f[1][1] = inf\)
    此时必须进行操作\(N\),故答案为\(f[N][1]\)
  • 若进行操作\(1\)
    \(f[1][1] = a[1], f[1][0] = inf\)
    此时答案为\(\min (f[n][0], f[n][1])\)

将以上两种情况的答案取最小值作为该问题的答案。

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;

const int N = 3e5 + 10;

ll f[N][2];
ll a[N];
int n;

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) scanf("%lld", &a[i]);

    ll ans = 1e18;

    //不选1
    f[1][0] = 0, f[1][1]= 1e18;
    for(int i = 2; i <= n; i ++){
        f[i][0] = f[i - 1][1];
        f[i][1] = min(f[i - 1][1], f[i - 1][0]) + a[i];
    }
    ans = min(ans, f[n][1]);

    //选1
    f[1][0] = 1e18, f[1][1]= a[1];
    for(int i = 2; i <= n; i ++){
        f[i][0] = f[i - 1][1];
        f[i][1] = min(f[i - 1][1], f[i - 1][0]) + a[i];
    }
    ans = min(ans, f[n][1]);
    ans = min(ans, f[n][0]);

    printf("%lld\n", ans);

    return 0;
}

标签:ABC,Animals,int,include,le,操作,251,若想,喂养
来源: https://www.cnblogs.com/bxhbxh/p/16347033.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有