动态规划常见例题及实现程序

题目来源于此大神: http://blog.csdn.net/tobewhatyouwanttobe/article/details/42805225

我是按照该blog来入门dp相关问题的。不断更新中。。。。。。2019/2/25

 

一、数塔问题

具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=2084

#include 

int main(){
    int N;
    int num;
    scanf("%d",&N);
    for(int i=0;imax2?max1:max2;
                }                                         //非边界值取路径相加最大的那个
                cnt++;
            }
        }
        int max = matrix[(--cnt)];
       // printf("%d %d ",cnt,num);
        for(int max_i = 1;max_i matrix[cnt-max_i] ? max:matrix[cnt-max_i];  //获得最大值
        }
        printf("%d\n",max);
    }
    return 0;
}

结果:Accepted

 

二、最长上升子序列

具体描述见连接:http://poj.org/problem?id=2533

// write your code here cpp
#include

int main(){
    int N;
    while(scanf("%d",&N)!= EOF){
        int *arr = new int[N];
        int *martix = new int [N];
        for(int i = 0;i=0;j--)
                if(arr[i] > arr[j])
                    martix[i] = martix[i] > (martix[j]+1)?martix[i]:(martix[j]+1);
        }
        int result = martix[0];
        for(int k = 1;kresult?martix[k]:result;
        printf("%d\n",result+1);
    }
}

结果:Accepted

PS: 时间复杂度为 o(N^2) 比较久

 

三、  hdu 1087  最大递增和

具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=1087

// write your code here cpp
#include

int main(){
    int N;
    while(scanf("%d",&N)!= EOF && N!=0){
        int *arr = new int[N];
        int *martix = new int [N];
        for(int i = 0;i=0;j--)
                if(arr[i] > arr[j])
                    martix[i] = martix[i] > (martix[j]+arr[i])?martix[i]:(martix[j]+arr[i]);
        }
        int result = martix[0];
        for(int k = 1;kresult?martix[k]:result;
        printf("%d\n",result);
    }
}

结果:Accepted  

PS:其实这道题跟第二个问题很类似,将第二问题改一下就好。

 

 

四、   hdu 2602  01背包

具体描述见连接:http://acm.hdu.edu.cn/showproblem.php?pid=2602

 

#include
#include
#include 

int MaxValue[1000][1000];
int main(){
    int Case,N,V;
    scanf("%d",&Case);
    while(Case--){
        scanf("%d%d",&N,&V);
        int *Value = new int[N+1];
        int *Volume = new int [N+1];
        for(int i = 1;i<=N;i++){
            scanf("%d",&Value[i]);
        }
        for(int i = 1;i<=N;i++){
            scanf("%d",&Volume[i]);
        }
        memset(MaxValue,0,sizeof(MaxValue));
        for(int i = 1;i<=N;i++)
            for(int j = 0;j<=V;j++){
                if(Volume[i]<=j)
                    MaxValue[i][j] = fmax(MaxValue[i-1][j],MaxValue[i-1][j-Volume[i]]+Value[i]);
                else
                    MaxValue[i][j] = MaxValue[i-1][j];
                //printf("%d ",MaxValue[i][j]);
            }
        printf("%d\n",MaxValue[N][V]);
        delete[] Value;
        delete[] Volume;
    }
    return 0;
}

一维滚动数组

#include
using namespace std;


int dp[20001];

int main(){
    int V,N;
    scanf("%d%d",&V,&N);
    int *tmp = new int[N];
    for(int i =0;i=tmp[i];v--){
            dp[v] = max(dp[v],dp[v-tmp[i]]+tmp[i]);
        }
    }
    int maxV = 0;
    for(int i =0;i<=V;i++)
        maxV = max(maxV,dp[i]);
    printf("%d\n",V-maxV);
    return 0;
}

完全背包问题:

 

 

 

五、 poj 1458 最长公共子序列

具体描述见连接:http://poj.org/problem?id=1458

#include 
#include 
#include 
#include 
using namespace std;

int maxvalue[1000][1000];

int main(){
    string str1,str2;
    while(cin >> str1 >> str2){
        int len1 = str1.length(),len2 = str2.length();
        for(int i = 0;i

 

六、神奇的口袋

#include 
using namespace std;

const int W = 40;
int main(){
    int N;
    scanf("%d",&N);
    vector< vector> way (W+1,vector(N+1));
    vector arr(N+1);
    
    for(int i = 1;i<=N;++i){
        cin >>arr[i];
        way[0][i] = 1;
    }
    way[0][0]=1;
    for(int w =1;w<=W;++w){
        for(int k =1;k<=N;k++){
            way[w][k] =way[w][k-1];
            int tmp = w-arr[k];
            if( tmp>=0){
                way[w][k] += way[tmp][k-1];
            }
        }
    }
    cout << way[W][N]<

 

注:本博文为原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:https://blog.csdn.net/aron_conli/article/details/87925453

原作者博客:https://blog.csdn.net/aron_conli
--------------------- 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(算法学习)