ABC 251 | E - Takahashi and Animals
题意描述
Takahashi有头牛,编号为,他可以通过以下种方式来喂养牛:
- 花费喂养牛和牛
- 花废喂养牛和牛
- 花费喂养牛和牛
- ... ...
- 花费喂养牛和牛
- 花费喂养牛和牛
Takahashi的目标是使得每一头牛都被喂养,并使得花费最小,输出该最小花费。
数据范围
题目解析
动态规划问题常用来解决最优化问题,而动态规划应用于这类问题的优势在于解决了重叠子问题,避免重复计算。动态规划算法的关键在于状态表示和状态转移。
首先对问题进行分析
- 若想牛被喂养,操作和操作需至少选择一个
- 若想牛被喂养,操作和操作需至少选择一个
- 若想牛被喂养,操作和操作需至少选择一个
- ... ...
- 若想牛被喂养,操作和操作需至少选择一个
- 若想牛被喂养,操作和操作需至少选择一个
状态表示
表示已对前个进行决策且第个不选的最小费用.
表示已对前个进行决策且第个选的最小费用.
状态转移
边界条件及问题答案
- 若不进行操作
此时必须进行操作,故答案为 - 若进行操作
此时答案为
将以上两种情况的答案取最小值作为该问题的答案。
代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库