alt

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;
}

最大子序列问题(注意不是最大字串!!!!)

alt

#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]进行比较

alt

最大递增子序列问题
#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;
}