小红的乘2除2

小红的乘2除2

https://ac.nowcoder.com/acm/contest/85187/D

小红的乘2除2

这题可以通过dp对所有状态进行分类讨论,比直接硬写要容易

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define int long long
signed main() {
	int n;
	cin >> n;
	vector<int> a(n + 1);
	for (int i = 1; i <= n; i++)
		cin >> a[i];

	vector<vector<int>> dp(n + 1, vector<int>(9));
	// dp[0] 没有进行操作
	// 最后一个数没有进行操作
	// dp[1] 进行过乘操作
	// dp[2] 进行过除操作
  	// dp[3] 进行两个操作

	// 最后一个数进行操作
	// dp[4] 进行乘操作 之前没有别的操作
	// dp[5] 进行乘操作 之前有除法的操作
	// dp[6] 进行除操作 之前没有别的操作
	// dp[7] 进行除操作 之前有乘法的操作
	// dp[8] 对最后一个数进行 两个操作
	dp[1][1] = 1e18;
	dp[1][2] = 1e18;
	dp[1][3] = 1e18;
	for (int i = 2; i <= n; i++) 
	{
		int t = abs(a[i - 1] - a[i]);
		dp[i][0] = dp[i - 1][0] + t;
		dp[i][1] = min(dp[i - 1][1] + t, dp[i - 1][4] + abs(a[i - 1] * 2 - a[i]));
		dp[i][2] = min(dp[i - 1][2] + t, dp[i - 1][6] + abs(a[i - 1] / 2 - a[i]));
		dp[i][3] = min(dp[i - 1][3] + t, dp[i - 1][8] + abs(a[i] - a[i - 1] / 2 * 2));
		dp[i][3] = min({ dp[i][3], dp[i - 1][5] + abs(a[i - 1] * 2 - a[i]), dp[i - 1][7] + abs(a[i - 1] / 2 - a[i])});

		dp[i][4] = dp[i - 1][0] + abs(a[i - 1] - a[i] * 2);
		dp[i][5] = min(dp[i - 1][2] + abs(a[i - 1] - a[i] * 2), dp[i - 1][6] + abs(a[i - 1] / 2 - a[i] * 2));

		dp[i][6] = dp[i - 1][0] + abs(a[i - 1] - a[i] / 2);
		dp[i][7] = min(dp[i - 1][1] + abs(a[i - 1] - a[i] / 2), dp[i - 1][4] + abs(a[i - 1] * 2 - a[i] / 2));
		dp[i][8] = dp[i - 1][0] + abs(a[i - 1] - a[i] / 2 * 2);
	}
	cout << min({ dp[n][3], dp[n][5], dp[n][7], dp[n][8] }) << "\n";
}
全部评论
%%%
点赞 回复 分享
发布于 2024-08-11 11:47 湖北
大神太猛啦o(* ̄▽ ̄*)ブ
点赞 回复 分享
发布于 2024-06-25 22:36 浙江

相关推荐

07-10 11:08
门头沟学院 Java
Sairus:我注册都注册不了提醒我手机号二次啥的,果然对于人才推得就是快,像我投完了就没回音的
投递京东等公司9个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 11:39
给我开两千工资还好意思,笑死我没,还转正才交社保,别太离谱啊我说
机械打工仔:前几天还看到一个试用期不让交社保的,今天就看到个实习期就要社保的,也算是开了眼了
点赞 评论 收藏
分享
评论
11
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务