[Algorithm]-DP (Dynamic Programming)

AtCoder-DP special topic address, click here

The general problems of dynamic programming can be divided into:
  • Determine the longest palindrome
  • Determine the maximum sum of number substrings
  • Longest non-decreasing subsequence
  • Longest Common Subsequence (LCS)
  • Knapsack problem

A - Frog 1

#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<iostream>
using namespace std;
#define MAX 0x3f3f3f3f
typedef long long ll;
int n,m,k;
int dp[100001];//表示第i块石头最少的消耗
int a[100001];
int main()
{
    
    
    cin>>n;
    for(int i = 0 ; i < n ; i++)
        cin>>a[i];
    dp[0] = 0;
    dp[1] = abs(a[1] - a[0]);
    for(int i = 2 ; i < n ; i++)
        dp[i] = min(dp[i-1] + abs(a[i] - a[i-1]), dp[i-2] + abs(a[i] - a[i-2]));
    cout<<dp[n-1];

}

B - Frog 2

#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<iostream>
using namespace std;
#define MAX 0x3f3f3f3f
typedef long long ll;
int n,m,k;
int dp[100001];//表示第i块石头最少的消耗
int a[100001];
int main()
{
    
    
    cin>>n>>k;
    for(int i = 0 ; i < n ; i++)
        cin>>a[i];
    dp[0] = 0;
    dp[1] = abs(a[1] - a[0]);
    for(int i = 2 ; i < n ; i++){
    
    
        int j;
        if(i >= k)
            j = i - k;
        else
            j = 0;
        int mmin = MAX;
        for(;j < i ; j++)
        mmin = min(mmin, dp[j] + abs(a[i] - a[j]));
        dp[i] = mmin;
    }
    cout<<dp[n-1];
}

C - Vacation

#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<iostream>
using namespace std;
#define MAX 0x3f3f3f3f
typedef long long ll;
int n,m,k;
struct Node{
    
    
    int a,b,c;
};
Node node[100005];
int dp[100005][5];//dp[i][j]表示第i天选第j个
int main()
{
    
    
    cin>>n;
    for(int i = 0 ; i < n ; i++)
        scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].c);

    dp[0][0] = node[0].a;
    dp[0][1] = node[0].b;
    dp[0][2] = node[0].c;
    for(int i = 1; i < n ; i++)
    {
    
    
        dp[i][0] += max(dp[i-1][1],dp[i-1][2]) + node[i].a;
        dp[i][1] += max(dp[i-1][0],dp[i-1][2]) + node[i].b;
        dp[i][2] += max(dp[i-1][0],dp[i-1][1]) + node[i].c;
    }
    cout<<max(max(dp[n-1][0],dp[n-1][1]),dp[n-1][2]);
    return 0;
}

D-Knapsack 1 (0-1 backpack)

#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<iostream>
using namespace std;
#define MAX 0x3f3f3f3f
typedef long long ll;
int n,m,k;
ll dp[100001];
ll w[100001];
ll v[100001];
int main()
{
    
    
    cin>>n>>k;
    for(int i = 0 ; i < n ; i++)
        cin>>w[i]>>v[i];
    for(int i = 0 ; i <n ; i ++)
        for(int j = k ; j>= w[i]; j--)
            dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
    cout<<dp[k];
}

F-LCS (requires output sequence, reverse DP)

#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<iostream>
using namespace std;
#define MAX 0x3f3f3f3f
typedef long long ll;
int n,m,k;
int dp[3001][3001];
int main()
{
    
    

    string a,b;
    cin>>a>>b;
    int len1 = a.size(),len2 = b.size();
    for(int i = len1 - 1; i >=0 ;i--)
    {
    
    
        for(int j = len2 - 1;j >= 0; j--)
        {
    
    
            if(a[i] == b[j])
                dp[i][j] = dp[i+1][j+1] + 1;
            else
                dp[i][j] = max(dp[i+1][j], dp[i][j+1]);
        }
    }
    int i=0;
    int j=0;
    while(i<len1&&j<len2)
    {
    
    
        if(a[i]==b[j])
        {
    
    
            cout<<a[i];
            i++;
            j++;
        }
        else if(dp[i][j]==dp[i+1][j])
            i++;
        else
            j++;     
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_43567222/article/details/114633124