等级标准
- 掌握基本算法中的动态规划方法;
- 能够使用上述方法编写指定功能的正确完整的程序。
1、最长上升子序列
考试题目
一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度。
时间限制:11000
内存限制:65536
输入
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
输出
最长上升子序列的长度。
样例输入
7
1 7 3 5 9 4 8
样例输出
4
参考答案
#include <bits/stdc++.h>
using namespace std;
int main(){
#ifdef LOCAL
freopen("202209_4_1.in", "r", stdin);
#endif
int N;
scanf("%d", &N);
int a[1010];
for(int i = 0; i < N; i++){
scanf("%d", &a[i]);
}
//定义dp[i]为以i位结尾的最长上升序列长度
int dp[1010];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int max_len = 0;
for(int i = 1; i < N; i++){
for(int j = i - 1; j >= 0; j--){
if(a[i] > a[j]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
//printf("%d ", dp[i]);
max_len = max(max_len, dp[i]);
}
printf("%d", max_len);
}
2、神奇的口袋
考试题目
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
时间限制:10000
内存限制:65536
输入
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
输出
输出不同的选择物品的方式的数目。
样例输入
3
20
20
20
样例输出
3
参考答案(递归)
#include<bits/stdc++.h>
using namespace std;
int goods[30];
//从前k种物品中选择一些,凑成体积w的做法数目
int ways(int w, int k){
if(w == 0) return 1; //没有需要凑的体积了,刚好凑满
if(k <= 0) return 0

本文精选四道典型的动态规划题目,包括最长上升子序列、神奇的口袋、滑雪和删除数字等,通过具体实例讲解动态规划的基本思想和实现方法。
最低0.47元/天 解锁文章
560

被折叠的 条评论
为什么被折叠?



