一.关于最长上升子序列问题:
思路如图:
我们可以定义一个dp数组去存放个数
代码如下
#include <iostream>
using namespace std;
const int Max = 1e5+10;
int arr[Max],dp[Max] ;
int main()
{int n;
cin>>n;
for(int i =1;i<=n;i++){
cin>>arr[i];
}
for(int i = 1;i<=n;i++){
dp[i] = 1;
for(int j = 1;j<i;j++){
if(arr[i]>arr[j]){
dp[i] = max(dp[j]+1,dp[i]);
}
}
}
int ans = 0;
for(int i = 1;i<=n;i++){
ans = max(ans,dp[i]);
}
cout<<ans<<" ";
// 请在此输入您的代码
return 0;
}
01背包
一维模板
题目:
有 NN 件物品和一个体积为 MM 的背包。第 ii 个物品的体积为 vivi,价值为 wiwi。每件物品只能使用一次。
请问可以通过什么样的方式选择物品,使得物品总体积不超过 MM 的情况下总价值最大,输出这个最大价值即可。
输入格式
第一行输入两个正整数 N,MN,M。(1≤N,M≤1000)(1≤N,M≤1000)
接下来 NN 行,每行输入两个整数 vi,wivi,wi。(0≤vi,wi≤1000)(0≤vi,wi≤1000)
输出格式
输出一个整数,表示符合题目要求的最大价值。
样例输入
4 5
1 2
2 4
3 4
4 5
样例输出
8
代码
#include <iostream>
using namespace std;
int n,m;
int dp[10010];
int v[10010],w[10010];
int main()
{ cin>>n>>m;
for(int i = 1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i = 1;i<=n;i++){
for(int j = m;j>=v[i];j--){
dp[j] = max(dp[j-v[i]]+w[i],dp[j]);
}
}
cout<<dp[m];
// 请在此输入您的代码
return 0;
}
注意:如果是完全背包的话,就将第二成循环变成正向的就行;