ACM--动态规划LIS,LCS及背包

今天看了一下dp

来看看代码吧

//*****LIS

#include<bits/stdc++.h>
using namespace std;

int a[10010];
int dp[10010];
int main()
{
    int n ;
    while (cin>>n&&n)
    {
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<i;j++)
            {
                if(a[i]>a[j])
                {
                    dp[i]=max(dp[j]+1,dp[i]);
                }
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
}


//hdu1257 导弹拦截系统   lis 

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f

int dp[10010]; //dp[i]表示长度为i+1的子序列末尾元素的最小值;
int a[10010];
int main()
{
    int n;
    while(cin>>n&&n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            dp[i]=INF;
        }
        for(int i=0;i<n;i++)
        {
            *lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素
        }
        cout<<lower_bound(dp,dp+n,INF)-dp<<endl;//找到第一个INF的地址
    }
    return 0;
}


//*******LCS示例代码

#include <bits/stdc++.h>
using namespace std;
string s1,s2,s3;
int dp[1000][1000];
int len1,len2;
int main()
{
    while(cin>>s1>>s2)
    {
        memset(dp,0,sizeof(dp));
        len1=s1.length();
        len2=s2.length();
        for(int i=0;i<len1;i++)
        {
            for(int j=0;j<len2;j++)
            {
                if(s1[i]==s2[j])
                    dp[i+1][j+1]=dp[i][j]+1;
                else
                {
                    dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
                }
            }
        }
         cout<<dp[len1][len2]<<endl;
    }
    return 0;
}

//*******01背包问题
状态转换方程
dp[i][j] MAX{dp[i-1],[j-wi]+Vi(j>=Wi),dp[i-1][j]}


#include<bits/stdc++.h>
using namespace std;

int n,m;
int dp[1000];
int v[1000];
int w[1000];
int main()
{
    while(cin>>n>>m)
    {
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
        {
            cin>>w[i]>>v[i];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=m;j>=w[i];j--){
                dp[j] = max(dp[j],dp[j-w[i]]=v[i]);
            }
        }
        cout<<dp[m]<<endl;
    }
    return 0;
}

测试示例
5
  1 2 3 4 5
w 3 2 6 4 3
v 4 2 3 7 1
dp[10] dp[7]+4,dp[10]




//完全背包

#include<bits/stdc++.h>
using namespace std;

int n,m;
int dp[1000];
int v[1000];
int m[1000];
int main()
{
    while (cin>>n>>m)
    {
        
    }
}

就是今天就是只学了LIS和LCS以及背包

参考hdu1257拦截系统的题目

猜你喜欢

转载自blog.csdn.net/hrw1234567890/article/details/85079576
今日推荐