首页 > 其他分享 >动态规划 Part I

动态规划 Part I

时间:2023-05-13 22:06:13浏览次数:32  
标签:int 样例 Part Limit Output 序列 Input 动态 规划


大家好,我是wangmy。

众所周知动态规划将原问题分解成若干个子问题,再把子问题分解成若干更多子问题。先求解子问题,再从这些子问题的解得到原问题的解。

今天我给大家分享一下动态规划的几道题和参考代码。

数字三角形

题目描述(Description)

动态规划 Part I_动态规划

动态规划 Part I_c++_02编辑


输入格式(Format Input)

第一行一个整数N(<=1000),表示三角形总共有几行 第二至第N+1行,给出这个数字三角形

输出格式(Format Output)

一个整数,表示一路上所有数的最大和,结果不会超过int64

输入样例(Sample Input)

4 1 3 2 4 10 1 4 3 2 20

输出样例(Sample Output)

24


限制(Restrictions)

时间限制(Time Limit):  1000 ms
内存限制(Memory Limit):  65536 KB

参考代码:

#include<bits/stdc++.h>
using namespace std;
//状态 f[i][j]:(i,j)的最大值
//转移方程式:f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j]
long long n,a[1010][1010],f[1010][1010];
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			scanf("%lld",&a[i][j]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
		}
	}
	long long ans=0;
	for(int i=1;i<=n;i++)
	{
		if(f[n][i]>ans)
		{
			ans=f[n][i];
		}
	}
	printf("%lld",ans);
	return 0;
}


最长上升子序列

题目描述(Description)

给定一个长度为 N 的整数序列 A

找到一组最长的整数序列 x 满足:

   1    <=    x1    <    x2    <    ...    <    xk    <=    N

   A[x1] < A[x2]  <    ...     <   A[xk]

即寻找 A 的一个最长子序列,满足:

该子序列中每个元素递增


输入格式(Format Input)

第一行一个整数N(N<=1000) 表示长度,第二行 N个数 A[i]表示序列里面的数,每个数不超过int范围。

输出格式(Format Output)

一行 表示最长递增子序列的长度

输入样例(Sample Input)

6 1 6 2 5 4 7

输出样例(Sample Output)

4


限制(Restrictions)

时间限制(Time Limit):  1000 ms
内存限制(Memory Limit):  65536 KB

参考代码:

#include<bits/stdc++.h>
using namespace std;
//f[i]以a[i]结尾的最大上升子序列长度 
//f[i] = max(f[i], f[j] + 1), j < i, a[j] < a[i]
int n, a[1010], f[1010];
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	
	for(int i = 1; i <= n; i++){
		//赋初始值 
		f[i] = 1;
		for(int j = 1; j < i; j++){
			if(a[j] < a[i]) f[i] = max(f[i], f[j] + 1);
		}
	}
	int ans = 0;
	for(int i = 1; i <= n; i++)
		if(ans < f[i]) ans = f[i];
	cout << ans; 
	return 0;
}


最长公共子序列

题目描述(Description)

给定两个整数序列 A 和 B

序列中每个数都在int范围之内

寻找一个最长的整数序列 X,满足:

X 是 A 的子序列

X 是 B 的子序列


输入格式(Format Input)

第一行:序列A的长度 第二行:给出序列A 第三行:序列B的长度 第四行:给出序列B

长度<=1000

输出格式(Format Output)

只有一行:表示最长的公共子序列的长度

输入样例(Sample Input)

6

1 6 2 5 4 7

7

0 1 2 5 5 2 7

输出样例(Sample Output)

4


限制(Restrictions)

时间限制(Time Limit):  1000 ms
内存限制(Memory Limit):  65536 KB

参考代码:

#include<bits/stdc++.h>
using namespace std;
int n, m, a[1001], b[1001], dp[1001][1001];
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	cin >> m;
	for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
	
	memset(dp, 0, sizeof(dp));
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(a[i] == b[j]){
				dp[i][j] = dp[i-1][j-1] + 1;
			}
			else{
				if(dp[i][j-1] > dp[i-1][j])
					dp[i][j] = dp[i][j-1];
				else
					dp[i][j] = dp[i-1][j]; 
			}	
		}
	}
	
	cout << dp[n][m];
	return 0;
}


装箱问题

题目描述(Description)

有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品(0 < n ≤ 30),每个物品有一个体积(正整数)。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。


输入格式(Format Input)

输入有若干行。第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品的各自体积。

输出格式(Format Output)

输出只有一行数据,该行只有一个数,表示最小的箱子剩余空间。

输入样例(Sample Input)

24 6 8 3 12 7 9 7

输出样例(Sample Output)

0


限制(Restrictions)

时间限制(Time Limit):  1000 ms
内存限制(Memory Limit):  65536 KB

参考代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;//                m即箱子容量V
int f[20010];
int w[40];
int main(){
    int i,j;
    scanf("%d%d",&m,&n);
    for(i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    for(i=1;i<=n;i++){
        for(j=m;j>=w[i];j--){  
            if(f[j]<f[j-w[i]]+w[i]){
                f[j]=f[j-w[i]]+w[i];
            }
        }
    }
    printf("%d\n",m-f[m]);
}

今天的分享到此结束,我们下次再见。(希望大家有自己的思考,不要一味着抄代码)


标签:int,样例,Part,Limit,Output,序列,Input,动态,规划
From: https://blog.51cto.com/wangmy666isking/6273809

相关文章

  • COMP3023动态编程
    COMP302323SProgrammingAssignmentLecture10introducesthedynamicprogrammingalgorithmforthe0-1knapsackproblem.Inthisprogrammingassignment,youneedtoimplementthealgorithmunderthefollowingrequirements.Environment-Theimplementationmus......
  • zookeeper总结-动态添加节点
    1.比如现在有zk服务节点node1,node2,node3;之前自己一直以为是直接在node4上配置node1,node2,node3,node4的cluster地址,然后启动node4的zk服务,然后node4的zk服务就能加入到node1,node2,node3这个zk集群里;现在发现不行,node4启动后客户端无法连接上去,它也不会同步node1/node2/node......
  • 【路径规划】基于粒子群算法的新型概率密度无人机作战路径规划附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 有趣的动态规划
    原文点此跳转什么是动态规划?动态规划也是算法设计的一种方法/思想。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题。基础案例场景一斐波那契数列当前数等于前面两个数的和。定义子问题:f(n)=f(n-1)+f(n-2)原文点此跳转......
  • 代理模式--静态代理+动态代理
    静态代理利用程序实现客户通过中介向房东租房的案例:优缺点理解:代理模式的具体步骤:动态代理同样是以租房为例:需要代理的类是租房的Rent类:Rent.javapackageorg.example.Test;publicinterfaceRent{publicvoidrent();}Host.javapackageorg.example.Te......
  • 动态代理
    一、概念什么是代理:如同中介,当一个类不能或不适合直接访问另一个对象时,适合使用。作用:动态代理可以在不更改原类代码的前提下,增强所有类的功能。二、解释(1)角色明星:唱歌、跳舞经纪人:代理明星,表示明星能干什么,来跟老板合作老板:找明星谈合作 (2)静态代理(三个对象)......
  • 树状数组--动态维护区间操作
    树状数组(二元索引树/二元下标树/BinaryIndexedTree,BIT/FenwickTree):树状数组虽名为数组,但从其英文名(BinaryIndexedTree)可看出它本质上是一种被表达为树的数据结构。对于大小为n的序列nums,最基本的树状数组以O(logn)时间复杂度同时支持如下两种操作。1)更......
  • kettle动态传输多表所遇问题
    客户切换服务器,涉及数据迁移。由于数据不是太庞大,不想用备份迁移来实现。数据库有两种,一个是mysql,一个是clickhouse 所遇问题:1、mysql迁移时,字段为''的值,转换为null,于是有由不能为null的就报错了解决办法:C:\Users\用户名.kettle目录中找到kettle......
  • Spartacus cart id 存储在浏览器 local storage 里面
    浏览器的localstorage(本地存储)是指浏览器提供的一种客户端存储机制,用于在用户的浏览器上存储少量数据。这些数据可以在同一域名下的所有页面之间共享,并且在浏览器关闭后也可以保留下来,直到被用户删除或达到存储上限。Localstorage是HTML5规范中引入的一种新的浏览器存储机......
  • 基于Expression Lambda表达式树的通用复杂动态查询构楗器——《摘要篇》
    基于表达式树的通用查询构造器常见的使用LinqExpression的做法这种代码众多,随便一搜就是, 但几乎都是单个条件的,单层级的,只能简单组装,组装成如:Field_A=1andField_B=2OrField_C=3--或者Field_A=1and(Field_B=2OrField_C=3) 是否可以灵活的查询条件组合&独立......