01背包--入门dp(注意数组范围要比最大范围开大一些)
#include <bits/stdc++.h>
using namespace std;
int dp[101][1001];
int w[1001], v[1001];
int solve(int N, int V)
{
for (int i = 1; i <= N; i++)
for (int j = 0; j <= V; j++) {
if (w[i] > j)//两种情况,选择最大的那一个o(n*C)的复杂度
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
return dp[N][V];
}
int main()
{
int N, V;
cin >> N >> V;
for (int i = 1; i <= N; i++)
cin >> w[i] >> v[i];
memset(dp, 0, sizeof(dp));
cout << solve(N, V) << endl;
return 0;
}
最大子序列问题(注意不是最大字串!!!!)
#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001],a[1001],b[1001];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
if(a[i]==b[j])//a[i],b[j]相同的时候的递推式,dp[i][j]仍然代表最终答案
dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1);
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);//两个字串分别代表不同的情况
}
cout << dp[n][m];//最终答案
}
dp取最值的时候,若不方便比较,可定义一个新变量,对每一个dp[i]进行比较
最大递增子序列问题
#include<bits/stdc++.h>
using namespace std;
const int N = 10001;
int a[N],dp[N];
int main(){
int n; cin >> n;
for(int i=1; i<=n; i++) cin >> a[i];
int ans = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++)
{
int max = 0;
for(int j=1; j<i; j++)
{
if(dp[j] > max && a[j] < a[i])
max = dp[j];
}
dp[i] = max+1;
if(dp[i] > ans) ans = dp[i];//ans用于比较
}
cout << ans << endl;
return 0;
}