学习dp,笔记

感觉初学dp和递归有点像,从最终状态入手,然后推出现这种状态的前一个状态。

题目
题目描述
逛完美丽的校园,HJ发觉自己还有毕业设计没有做完,苦逼的HJ准备了n天的时间来完成他的毕业设计,按他的设想, 计划中的时间将在课设前端, 课设后端, 娱乐, 这三件事中度过,;
他进行了项目排期, 他不会两天连续做前端或做后端, 只有当排期为第i天做前端时, 他才在第i天做前端, 当排期为第i天做后端时, 他才在第i天做后端, 他一天只能做一件事, 要么前端, 要么后端, 要么娱乐,;
现在随机生成n天计划的排期, 求HJ最少能娱乐几天。

输入
第一行一个整数 n, n(1≤n≤100000) 表示天数n;
第二行 n 个数 每个数为0或1,第 i 个数表示hj在第 i 天是否能做前端(1为能做前端, 0为不能做前端);
第三行 n 个数 每个数为0或1,第 i 个数表示hj在第i天是否能做后端(1为能做后端, 0为不能做后端);

输出
一个整数, 表示hj最小娱乐天数。

样例输入
5
0 1 1 0 0
0 0 1 1 0

样例输出
3

提示
HJ可在第一天休息, 第二天做前端, 第三天或第四天做后端(第三天或第四天一天休息), 第五天休息, 最少休息三天。

思路
想要最少的休息时间就是要找到最多的学习时间。
然后前一天学前端第二天就一定不能学前端,所以在前端后一定会指向后端,因为指向后端学习的天数一定大于等于前端。
所以指向前端,的可能性就是前一个前端(不能加这个前端)和前一个后端(加这个前端),然后比较大小。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int a[2][100050], n;
int dp[2][100050];

int main()
{
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>a[0][i];
	for(int i=0; i<n; i++)
		cin>>a[1][i];
	for(int i=0; i<n; i++)
	{
		dp[1][i+1]=max(dp[0][i]+a[1][i], dp[1][i]);
		dp[0][i+1]=max(dp[1][i]+a[0][i], dp[0][i]);
	}
	cout<<n-max(dp[1][n-1], dp[0][n-1]);
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一篇关于区间DP学习笔记,希望对你有所帮助。 ### 什么是区间DP 区间 DP 是一种动态规划算法,用于解决一些区间上的问题。具体来说,区间 DP 通常用于解决如下问题: - 最长公共子序列(LCS) - 最长递增子序列(LIS) - 最大子段和 - 区间选数问题 区间 DP 通常采用分治或递推的方式进行求解,具体方法取决于问题的性质。 ### 区间 DP 的递推方法 区间 DP 的递推方法通常有两种,一种是自底向上的递推方法,一种是自顶向下的记忆化搜索方法。 自底向上的递推方法通常采用二维数组或三维数组来记录状态转移方程,具体的递推方式如下: ```cpp for (int len = 2; len <= n; len++) { for (int i = 1; i <= n - len + 1; i++) { int j = i + len - 1; for (int k = i; k < j; k++) { // 状态转移方程 } } } ``` 其中,len 表示区间长度,i 和 j 分别表示区间的左右端点,k 表示区间的划分点。 自顶向下的记忆化搜索方法通常采用记忆化数组来记录状态转移方程,具体的递推方式如下: ```cpp int dp(int i, int j) { if (i == j) return 0; if (memo[i][j] != -1) return memo[i][j]; memo[i][j] = INF; for (int k = i; k < j; k++) { memo[i][j] = min(memo[i][j], dp(i, k) + dp(k + 1, j) + ...); } return memo[i][j]; } ``` 其中,i 和 j 分别表示区间的左右端点,k 表示区间的划分点,memo 数组用于记忆化状态转移方程。 ### 区间 DP 的优化 对于一些区间 DP 问题,我们可以通过一些技巧和优化来减少时间和空间的消耗。 一种常见的优化方式是状态压缩,将二维或三维数组压缩成一维数组,从而减少空间的消耗。 另一种常见的优化方式是使用滚动数组,将数组的维度从二维或三维减少到一维,从而减少时间和空间的消耗。 此外,对于一些具有特殊性质的区间 DP 问题,我们还可以使用单调队列或单调栈等数据结构来进行优化,从而减少时间和空间的消耗。 ### 总结 区间 DP 是一种常用的动态规划算法,用于解决一些区间上的问题。区间 DP 通常采用分治或递推的方式进行求解,具体方法取决于问题的性质。对于一些区间 DP 问题,我们可以通过一些技巧和优化来减少时间和空间的消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值