DP 动态规划 入门

开一个帖子记录dp的入门题
1060 开心的金明

#include 

using namespace std;
int w[30],v[30],f[30001];
int m,n;
int main()
{
        scanf("%d %d",&m,&n);
    for(int i=0;i<n;i++){
     
        scanf("%d %d",&v[i],&w[i]);
        w[i]*=v[i];
    }
    for(int i=0;i<n;i++)//dp
        for(int j=30000;j>=v[i];j--)
        f[j]=max(f[j],f[j-v[i]]+w[i]);
    printf("%d",f[m]);
    return 0;
}

更新一道01背包。。单一取数
采药 洛谷 1048

#include 

using namespace std;
struct node{
     
int vul,tim;}a[1005];
int dp[1005];
int main()
{
        int m,n;
    scanf("%d %d",&m,&n);//m为总时间。
    for(int i=0;i<n;i++)
        scanf("%d %d",&a[i].tim,&a[i].vul);
    for(int j=0;j<n;j++)
    for(int i=m;i>=a[j].tim;i--){
     //确保每个药只采一次!!
    dp[i]=max(dp[i],(dp[i-a[j].tim]+a[j].vul));
   }
    cout<<dp[m]<<endl;
    return 0;
}

更一道最长不下降序列问题
NEFUdp训练 D题

#include
using namespace std;
int map1[101][101],dp[101][101];
int main(){
     
    int n,x,y;
   scanf("%d",&n);
   while(n--){
     
    scanf("%d %d",&y,&x);
    for(int i=1;i<=y;i++)
        for(int j=1;j<=x;j++)
        scanf("%d",&map1[i][j]);
    for(int i=1;i<=y;i++)
    for(int j=1;j<=x;j++){
     //记录后面的数
        dp[i][j]=max(dp[i][j],map1[i][j]+dp[i-1][j]);
        dp[i][j]=max(dp[i][j],map1[i][j]+dp[i][j-1]);
   }
   printf("%d\n",dp[y][x]);}
return 0;
}

你可能感兴趣的:(算法,动态规划,acm竞赛)