DP环形结构两种处理方法(两次DP(一次断开,一次强制连接), 环拆成链复制一倍)

本文主要是介绍DP环形结构两种处理方法(两次DP(一次断开,一次强制连接), 环拆成链复制一倍),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 AcWing 288. 休息时间(两次DP + 滚动数组优化)

//F[i, j, 0&1]表示当前i个时间段时,一共选了j个,并且当前的选(1)或者不选(0)时获得的恢复值的最大值
//F[i, j, 1] = max(F[i - 1, j - 1, 1] + U[i], F[i - 1][j - 1][0])
//F[i, j, 0] = max(F[i - 1, j, 1], F[i - 1, j, 0])
//直接存储可能会爆空间,所以我们采用滚动数组优化
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3840;
int n, m;
int F[2][N][2], a[N];
signed main(){cin >> n >> m;for (int i = 1; i <= n; ++i)cin >> a[i];//当第n个小时睡觉时memset(F, 0xcf, sizeof F);F[1][0][0] = 0, F[1][1][1] = a[1];for (int i = 2; i <= n; ++i)for (int j = 0; j <= min(i, m); ++j){if (j >= 1)F[i & 1][j][1] = max(F[(i - 1) & 1][j - 1][1] + a[i], F[(i - 1) & 1][j - 1][0]);F[i & 1][j][0] = max(F[(i - 1) & 1][j][1], F[(i - 1) & 1][j][0]);}int ans = F[n & 1][m][1];//当第n个小时不睡觉时memset(F, 0xcf, sizeof F);F[1][0][0] = F[1][1][1] = 0;for (int i = 2; i <= n; ++i)for (int j = 0; j <= min(i, m); ++j){if (j >= 1)F[i & 1][j][1] = max(F[(i - 1) & 1][j - 1][1] + a[i], F[(i - 1) & 1][j - 1][0]);F[i & 1][j][0] = max(F[(i - 1) & 1][j][1], F[(i - 1) & 1][j][0]);}ans = max(ans, F[n & 1][m][0]);cout << ans << '\n';
}

这篇关于DP环形结构两种处理方法(两次DP(一次断开,一次强制连接), 环拆成链复制一倍)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350970

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施: