首页 > 其他分享 >动态规划(一)

动态规划(一)

时间:2024-03-27 23:31:54浏览次数:32  
标签:int ll nullptr cin tie 动态 规划 dp

文章目录

1、建造房屋

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll p = 1e9+7;
int n,m,k; 
ll dp[50][5000];//前i个街道花了j元的方案数 dp[i][j] += dp[i-1][j-v] 
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>m>>k;
	//因为有至少一个房屋的限制,所以我们先定一个位置
	ll o=m-1,h=k-n;// o 每个街道余下的位置,h 剩余的预算 
	for(ll i=0;i<=h;i++)dp[0][i]=1;// 剩余的预算 最多可以有几个位置 
	for(ll j=0;j<=n;j++)dp[j][0]=1;// 所有的街道起初都要有一个位置 
	
	for(ll i=1;i<=n;i++) {
		for(ll j=1;j<=h;j++){
			if(j>i*o){
				dp[i][j]=dp[i][j-1];
				continue;
			}
			for(ll v=0;v<=j&&v<=o;v++)dp[i][j]=(dp[i][j]+dp[i-1][j-v])%p;
		}
	}
	cout<<dp[n][h];
	return 0;
}

2、破损的楼梯

#include<bits/stdc++.h>
using namespace std;
// dp[i] = dp[i-1] + dp[i-2]
using ll = long long;
const ll p = 1e9+7;
ll n,m,dp[100001],a[100001];
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int mm;cin>>mm;
		a[mm]=1;
	}
	dp[0]=1;
	if(!a[1])dp[1]=1;
	for(ll i=2;i<=n;i++){
		if(a[i])continue;
		dp[i]=(dp[i-1]+dp[i-2])%p;
	}
	cout<<dp[n];
	return 0;
}

3、可构造的序列总数

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
const ll p = 1e9+7;                                 
ll dp[2005][2005];//dp[i][j]表示序列长度为 i,且以 j 结尾的合法序列的数量 
ll ans;
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int N,K;cin>>K>>N;
    for(int i=1;i<=K;i++)dp[1][i]=1;//只有1个数,无论是选择1~K中哪个数,都只有1种方案 
    
    for(int i=2;i<=N;i++){//2~N 遍历每一种序列长度
		for(int j=1;j<=K;j++){// 遍历当前序列中最后一个元数的每一种可能 
			for(int k=1;k*k<=j;k++){//遍历每一种可能是j的因子的取值
				if(k*k==j){//偶数,就一个因数  k 
					dp[i][j]=(dp[i][j]+dp[i-1][k])%p; 
				}else if(j%k==0){//说明有两个因数,j/k 和 k 
					dp[i][j]=(dp[i][j]+dp[i-1][j/k]+dp[i-1][k])%p; 
				}	
			}	
		} 
	}
    
    for(int i=1;i<=K;i++){//累加所有长度为N的以1~K结尾的序列数量 
    	ans=(ans+dp[N][i])%p;
	}
	cout<<ans;
    return 0;
}

4、最快洗车时间

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e4+5;
//dp[i][j] 表示前 i 辆车的洗车时间是否需要 j 时间(true or false) 
int tim[109];
bool dp[109][N];
ll n,sum,ans=N;
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>tim[i];
		sum=sum+tim[i];//一台机器洗车时间 
	}
	for(int i=0;i<=n;i++)dp[i][0]=true;
	
	for(int i=1;i<=n;i++){//遍历 n 辆车都可能的洗车时间
		for(int j=0;j<=sum;j++){//对于每一种洗车方案,遍历每一种可能的方案
			dp[i][j]=dp[i-1][j];
			if(j>=tim[i])dp[i][j]=dp[i][j]|dp[i-1][j-tim[i]];//选择洗 or 不洗 
		} 	
	} 
	
	for(ll i=1;i<=sum;i++){
		if(dp[n][i]){
			int tmp=max(sum-i,i);
			if(tmp<ans)ans=tmp;
		}
	}
	cout<<ans;
	return 0;
}

5、安全序列

#include<bits/stdc++.h>
using namespace std;
const int p = 1e9+7,N = 1e6+5;
int dp[N],prefix[N];//  dp[i] 表示以位置 i 结尾的方案总数 
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	int n,k;cin>>n>>k;
	
	dp[0]=prefix[0]=1;
	for(int i=1;i<=n;i++){
		if(i-k-1<1)dp[i]=1;
		else dp[i]=prefix[i-k-1];
		prefix[i]=(prefix[i-1]+dp[i])%p;
	}
	cout<<prefix[n]<<'\n';
	return 0;
}

6、地图

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+3;
char mp[N][N];
int n,m,sk; 
int dp[105][105][2][7];//记忆化数组 
// dp[i][j][0][k] 表示从(i,j)开始,方向向下(1向上),共改变了k次方向,到达终点的方案数量 
bool isnmp(int x,int y){
	return x>0&&x<=n&&y>0&&y<=m;
}
int dfs(int x,int y,int tag,int k){
	int cnt=0;
	if(!isnmp(x,y)||mp[x][y]=='#')return 0;
	if(x==n&&y==m)return 1;
	if(dp[x][y][tag][k])return dp[x][y][tag][k];
	
	if(k<sk){
		cnt=cnt+dfs(x+1,y,1,tag==1?k:k+1);//向下
		cnt=cnt+dfs(x,y+1,0,tag==0?k:k+1);//向右 
	}else if(k==sk){
		if(tag==0){
			cnt=cnt+dfs(x,y+1,tag,k);
		}
		if(tag==1){
			cnt=cnt+dfs(x+1,y,tag,k);
		}
	}
	return dp[x][y][tag][k]=cnt;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>m>>sk;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>mp[i][j];
	int ans=0;		
	ans=ans+dfs(1,2,0,0);
	ans=ans+dfs(2,1,1,0);
	cout<<ans;
	return 0;
}

7、电影放映计划

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+5,M = 200;
int dp[N],m,n,t[M],w[M],k;
int main(){
	cin>>m>>n;
	for(int i=0;i<n;i++)cin>>t[i]>>w[i];
	cin>>k;
	m+=k;
	for(int i=1;i<=m;i++){
		dp[i]=dp[i-1];
		for(int j=0;j<n;j++){
			if(i>=t[j]+k){
				// dp[i]表示放映时间为i时的最大利润 
				dp[i]=max(dp[i],dp[i-t[j]-k]+w[j]);
			}
		}
	} 
	cout<<dp[m];
	return 0;
}

标签:int,ll,nullptr,cin,tie,动态,规划,dp
From: https://blog.csdn.net/m0_73337964/article/details/137075647

相关文章

  • [THUWC2018]城市规划的题解
    [THUWC2018]城市规划连通块问题,我们考虑树形DP。设\(f_{u,j}\)表示在以\(u\)为根的子树内,选的颜色集合为\(a_{u},j\)(两个颜色都必须选)且必须选点\(u\)的情况下的连通块个数。特殊的,\(f_{u,a_{u}}\)表示颜色只有\(a_{u}\)的情况数。对于\(v\inson_u\),有:若\(a_{u......
  • libVLC 动态视频壁纸
    在Windows上,你可能需要使用WindowsAPI来设置壁纸,而在Linux上,你可能需要使用某种桌面环境特有的方法。在macOS上,这一功能可能受到限制。效果图如下所示:以下是一个简单的示例,说明了如何在Windows上使用C++和libVLC库来实现这一功能。请注意,这个示例可能需要根......
  • 我的计算机学习之旅:从热爱到规划!
    第一部分:结缘计算机在选择计算机专业之前,我曾认真考虑过自己的兴趣和能力。我对计算机的兴趣起源于小时候的一次偶然机会,当时我第一次接触到计算机,被它神奇的功能所吸引。随着时间的推移,我越来越深入地了解计算机,并发现自己对它的兴趣越来越浓厚。因此,我决定选择计算机专业作为我......
  • 关于动态调用类库的一点实践
    由于应用需求,需要调用C的类库,本来是用[DllImport]中绝对路径的方式引入就行,但无奈该类库还有其他类库,也并非自己的程序提供,所以还是想采用动态的方式进行引入。Tips:由于是C的类库,不能采用Assembly.Load的方式,会抛出System.BadImageFormatException:“BadILformat“异常。DllIm......
  • 动态规划刷题(算法竞赛、蓝桥杯)--数字三角形(线性DP)
    1、题目链接:[USACO1.5][IOI1994]数字三角形NumberTriangles-洛谷#include<bits/stdc++.h>usingnamespacestd;intr;constintN=1010;inta[N][N];intmain(){ cin>>r; for(inti=1;i<=r;i++){ for(intj=1;j<=i;j++){ cin>>a[i][j]; ......
  • Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解
    【saas云平台】打造全行业全渠道全场景的saas产品,为经营场景提供一体化解决方案;门店经营区域化、网店经营一体化,本地化、全方位、一站式服务,为多门店提供统一运营解决方案;提供丰富多样的营销玩法覆盖所有经营场景,助力商家成功;系统稳定压倒一切,让商家经营有保障,消费者购物更放心......
  • 鸿蒙应用开发新体验——论大厂产业规划与就业趋势
    之前很多同学都能看到各种“前端已死、全是外包,程序员还有没有出路”等话题,到底是我们国内产业结构导致行业就业寒冬,还是利用求职者不明白市场的信息差来制造焦虑?结合近年来,od走入大家视角。做技术的程序员应该都不陌生od这个词,也有好多人疑惑这到底是为什么,互联网大厂频频“广进......
  • 蜗牛(基础动态规划)
    1importjava.util.Scanner;2//1:无需package3//2:类名必须Main,不可修改45publicclassMain{6publicstaticvoidmain(String[]args){7Scannersc=newScanner(System.in);8intn=sc.nextInt();9int[]x......
  • 网络攻防中黑客常用的十大渗透测试演练系统,百款渗透测试工具集合,安卓防逆向、防动态分
    网络攻防中黑客常用的十大渗透测试演练系统,百款渗透测试工具集合,安卓防逆向、防动态分析、渗透测试及加固详细教程。对目标机器进行全面的渗透测试是一个复杂的过程,需要遵循一系列的步骤来确保系统的安全性。以下是一个详细的渗透测试流程,包括关键步骤和一些基本的命令或......
  • 动态表单校验
    单个的表单域上传递属性的验证规则记录一次动态表单嵌套动态表单,前端必填校验的问题。之前没怎么写过前端代码,看文档也不够仔细~~按常规方法写完页面之后,测试发现校验都加上去了,但是填写内容之后校验也一直在,并且添加的中文校验提示没生效,一直是英文的提示。页面大致长下面......