[kuangbin带你飞]专题十二 基础DP1

A

别人家的博客
别人家的博客

题意: m个不重叠的区间的 最大值

dp[i][j]表示 在确保 第j 个数在的情况下分成 i 组的情况, 所以存在两种情况,第j个数与前
dp[i][j-1]一起 或者 dp[i-1][k] 一起单独成区间

dp[i][j]=max(dp[i][j-1]+max(dp[i-1][k]))+a[j]

k的取值为 (i-1)~j

而max(dp[i-1][k]) 表示上一次求得的值 ,而dp只与上一次 有关,并记录上一次的最大值即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 1000003
ll dp[maxn][2];
ll sum[maxn];
int main()
{
    ll m,n;
    ll t;
    while(cin>>m>>n)
    {
        sum[0]=0;
        dp[0][0]=0;
        dp[0][1]=0;
        for(int i=1;i<=n;i++)
        {
            cin>>t;
            sum[i]=sum[i-1]+t;
            dp[i][0]=0;
            dp[i][1]=0;
        }
        ll ans=0;
        for(int i=1;i<=m;i++)
        {
             ans=-327670000005;
            for(int j=i;j<=n;j++)
            {
                   // cout<<dp[j-1][0]<<" "<<dp[j-1][1]<<" "<<(sum[j]-sum[j-1])<<endl;
                    dp[j][1]=max(dp[j-1][1],dp[j-1][0])+sum[j]-sum[j-1];
                    dp[j-1][0]=ans;
                    ans=max(ans,dp[j][1]);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

B hdu 1029

题意:输出 超过 一半的数 是什么?

水题吧

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<ll,int>mapp;
int main()
{
    int n;
    ll t;
    while(scanf("%d",&n)!=EOF)
    {
        ll ui=0;
       mapp.clear();
      for(int i=0;i<n;i++)
      {
          scanf("%lld",&t);
          mapp[t]++;
          if(mapp[t]==(n+1)/2)
          {
              ui=t;
             //break;
          }
      }
        cout<<ui<<endl;
    }
    return 0;
}

C hdu 1069

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node{
int x;
int y;
int z;
};
Node node[200];
int height[200];
bool cmp(Node a,Node b)
{
    if(a.x==b.x)
    {
        if(b.y==a.y)
        {
            return a.z>b.z;
        }
        return a.y>b.y;
    }
    return a.x>b.x;
}
int main()
{
    int n;
    int x,y,z;
    int t=1;
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(height,0,sizeof(height));
      for(int i=0;i<n;i++)
      {
          cin>>x>>y>>z;
          node[i*6].x=x;
          node[i*6].y=y;
          node[i*6].z=z;

          node[i*6+1].x=x;
          node[i*6+1].y=z;
          node[i*6+1].z=y;


          node[i*6+2].x=y;
          node[i*6+2].y=x;
          node[i*6+2].z=z;

          node[i*6+3].x=y;
          node[i*6+3].y=z;
          node[i*6+3].z=x;

          node[i*6+4].x=z;
          node[i*6+4].y=y;
          node[i*6+4].z=x;

          node[i*6+5].x=z;
          node[i*6+5].y=x;
          node[i*6+5].z=y;
      }
      sort(node,node+6*n,cmp);
      height[0]=node[0].z;
      int ans=height[0];
      for(int i=0;i<n*6;i++)
      {
          height[i]=node[i].z;
      }
      for(int i=0;i<n*6;i++)
      {
          for(int j=i+1;j<n*6;j++)
          {
              if(node[i].x>node[j].x&&node[i].y>node[j].y)
              {
                  if(height[j]<height[i]+node[j].z)
                  height[j]=height[i]+node[j].z;
                 // cout<<i<<" "<<j<<" "<<height[j]<<endl;
                  ans=max(ans,height[j]);
              }
          }
      }
      cout<<"Case "<<(t++)<<": maximum height = "<<ans<<endl;
    }
    return 0;
}


D hdu 1074

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int pre[40000];
int dp[40000];
struct Node{
string a;
int et;
int lt;
};
Node node[16];
int t[40000];
void print(int x)
{
    if(x==0)
    {
        return ;
    }
    else
    {
        print(x-(1<<pre[x]));
    }
    cout<<node[pre[x]].a<<endl;
}
int main()
{
    int n;
    int cn;
    int tn;
    cin>>tn;
    while(tn--)
    {
      cin>>n;
      memset(t,0,sizeof(t));
      memset(dp,0,sizeof(dp));
      memset(pre,-1,sizeof(pre));
      for(int i=0;i<=n;i++)
      {
          pre[i]=i;
      }
      for(int i=0;i<n;i++)
      {
             cin>>node[i].a>>node[i].et>>node[i].lt;
      }
      //i 表示状态
      for(int i=1;i<(1<<n);i++)
      {
          dp[i]=1000000000;
          for(int j=n-1;j>=0;j--)
          {
              int temp=(1<<j);
              // i中没有 这个作业的话
              if(!(i&temp))
              {
                  continue;
              }
              int score=t[i-temp]+node[j].lt-node[j].et;
              if(score<0)
              {
                  score=0;
              }
              if(dp[i]>dp[i-temp]+score)
              {
                  dp[i]=dp[i-temp]+score;
                  t[i]=t[i-temp]+node[j].lt;
                  pre[i]=j;
              }
          }
      }
      cout<<dp[(1<<n)-1]<<endl;
      print((1<<n)-1);
    }
    return 0;
}

E hdu 1087

[kuangbin]https://www.cnblogs.com/xiong-/p/4093962.html()

最大递增 子序列 的和 ,dp 复杂度为 n^2 上面的链接中提供了 nlongn 线段树的解法

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[1001];
ll ans[1001];
ll en;
int main()
{
    int n;
    while(cin>>n&&n)
    {
for(int i=0;i<n;i++)
{
    cin>>num[i];
    ans[i]=num[i];
}
int a,b;
a=b=0;
ll temp=num[0];
for(int i=0;i<n;i++)
{
    for(int j=0;j<i;j++)
    {
        if(num[j]<num[i])
        {
            if(ans[j]+num[i]>ans[i])
            {
                ans[i]=ans[j]+num[i];
            }
        }
    }
    temp=max(temp,ans[i]);
}
cout<<temp<<endl;
    }
    return 0;
}

F 1114

题意: 装满的完全背包 价值最低是多少

说起背包问题 不得不说 崔添翼的背包九讲 讲得实在是太好了太好了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 5000003
ll dp[maxn];
struct Node{
ll w;
ll v;
};
Node node[501];
int main()
{

    int t;
    cin>>t;
    ll ee,ff;
    while(t--)
    {
        cin>>ee>>ff;
        ee=ff-ee;
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>node[i].v>>node[i].w;
        }
        fill(dp,dp+ee+1,maxn);
        ll ans=maxn;
        for(int i=0;i<n;i++)
        {
            dp[node[i].w]=min(dp[node[i].w],node[i].v);
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<=ee;j++)
            {
                if(j>=node[i].w&&dp[j-node[i].w]!=maxn)
                {
                    if(dp[j]==maxn)
                    {
                        dp[j]=dp[j-node[i].w]+node[i].v;
                    }
                    else
                    dp[j]=min(dp[j],dp[j-node[i].w]+node[i].v); //无限 完全 背包 最小
                }
// 无限 完全 背包 最大
                //dp[j]=max(dp[j],dp[j-node[i].w]+node[i].v);
            }
        }
        if(dp[ee]==maxn)
        {
            cout<<"This is impossible."<<endl;
        }
        else
        {
            cout<<"The minimum amount of money in the piggy-bank is "<<dp[ee]<<"."<<endl;

        }
    }
    return 0;
}

G hdu1176

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 5000003
int mapp[13][100002];
bool vis[13][100002];
int main()
{
 //freopen("input.txt","r",stdin);
 //freopen("output.txt","w",stdout);
    int t;
    int a,b;
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        memset(mapp,0,sizeof((mapp)));
        memset(vis,0,sizeof(vis));
        t=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&a,&b);
            mapp[a+1][b]++;
            t=max(t,b);
        }
        int ans=0;
        vis[6][0]=1;
        for(int i=1;i<=t;i++)
        {
            int temp=0;
            for(int j=1;j<12;j++)
            {
               // cout<<mapp[j][i];
                if(vis[j][i-1])
                {
                    temp=mapp[j][i-1]+mapp[j][i];
                    vis[j][i]=1;
                }
                if(j>1&&vis[j-1][i-1])
                {
                 temp=max(temp,(mapp[j-1][i-1]+mapp[j][i]));
                 vis[j][i]=1;
                }
                if(j<11&&vis[j+1][i-1])
                {
                 temp=max((mapp[j+1][i-1]+mapp[j][i]),temp);
                 vis[j][i]=1;
                }
                if(vis[j][i])
                {
                 mapp[j][i]=temp;
                 ans=max(mapp[j][i],ans);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

F hdu 1260

#include <bits/stdc++.h>
using namespace std;
#define maxn 101
int n1[2001];
int n2[2001];
int dp[2001][2];
int main()
{
   // freopen("input.txt","r",stdin);
    int n;
    int t;
    cin>>t;
    int a,b;
    while(t--)
    {
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>n1[i+1];
    }
    for(int i=0;i<n-1;i++)
    {
        cin>>n2[i+1];
    }
        for(int j=0;j<=2000;j++)
        {
            dp[j][0]=25000;
            dp[j][1]=25000;
        }
         dp[1][0]=n1[1];
         dp[0][0]=0;
         dp[0][1]=0;
    for(int i=2;i<=n;i++)
    {
        dp[i][0]=min(dp[i-1][0],dp[i-1][1])+n1[i];
        dp[i][1]=min(dp[i-2][0],dp[i-2][1])+n2[i-1];
    }
    int ans=min(dp[n][0],dp[n][1]);
    //cout<<ans<<endl;
    int h=ans/3600;
    int fen=ans%3600/60;
    int seco=ans%60;
    h+=8;
    int f=0;
    if(h>=12)
    {
        f=1;
    }
    if(f==0)
    {
        printf("%02d:%02d:%02d am\n",h,fen,seco);
    }
    else
    {
         printf("%02d:%02d:%02d pm\n",h,fen,seco);
    }
    }
    return 0;
}

I hdu1257

贪心?

#include <bits/stdc++.h>
using namespace std;
#define maxn 101
int n1[2001];
vector<int>v;
int main()
{
    //freopen("input.txt","r",stdin);
    int n;
    int t;
    int a,b;
    int ans=0;
    while(cin>>n)
    {
        v.clear();
        ans=0;
    for(int i=1;i<=n;i++)
    {
        cin>>n1[i];
    }
        for(int i=1;i<=n;i++)
        {
                int f=0;
                sort(v.begin(),v.end());
                for(int j=0;j<v.size();j++)
                {
                    if(v[j]>=n1[i])
                    {
                        f=1;
                        v[j]=n1[i];
                        break;
                    }
                }
                if(f==0)
                {
                  //  cout<<n1[i]<<endl;
                    ans++;
                    v.push_back(n1[i]);
                }

        }
        cout<<ans<<endl;
    }
    return 0;
}

J hdu1160

#include <bits/stdc++.h>
using namespace std;
#define maxn 101
int n1[2001];
vector<int>v;
struct Node{
int w;
int s;
int id;}node[1001];
int c[1001];
int dp[1001];
bool cmp(Node a,Node b)
{
    if(a.w==b.w)
    {
        return a.s>b.s;
    }
    return a.w<b.w;
}
void pr(int ff,int cn)
{
    if(cn<=0)
        return;
    else
    {
        pr(c[ff],cn-1);
        cout<<node[ff].id<<endl;
    }
}
int main()
{
  // freopen("input.txt","r",stdin);
    int n=0;
    int t;
    int a,b;
    int ans=1;
    while(cin>>node[n].w>>node[n].s)
        {
            node[n++].id=n;
        }
    sort(node,node+n,cmp);
    int temp=1;
    int f=1;
    dp[0]=1;
    int mf=0;
    for(int i=1;i<n;i++)
    {
        f=-1;
        temp=1;
        for(int j=0;j<i;j++)
        {
            if(node[j].w<node[i].w&&node[j].s>node[i].s)
            {
                  if(temp<dp[j]+1)
                  {
                      f=j;
                      temp=dp[j]+1;
                  }
            }
        }
        dp[i]=temp;
        if(ans<dp[i])
        {
            ans=dp[i];
            mf=i;
        }
        c[i]=f;
    }
    cout<<ans<<endl;
    pr(mf,ans);
    return 0;
}



L poj 1458
最长公共子序列

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
#define maxn 201
int ma[1000][1000];
int main()
{
    //freopen("input.txt","r",stdin);
    int cn=0;
    string s1,s2;
    while(cin>>s1>>s2)
    {
        memset(ma,0,sizeof(ma));
        for(int i=0;i<s2.size();i++)
        {
            for(int j=0;j<s1.size();j++)
            {
                if(s2[i]==s1[j])
                {
                    ma[i+1][j+1]=ma[i][j]+1;
                }
                else
                {
                    ma[i+1][j+1]=max(ma[i][j+1],ma[i+1][j]);
                //    cout<<"2 : "<<i<<" "<<j<<" "<<ma[i][j]<<endl;
                }
            }
        }
        cout<<ma[s2.size()][s1.size()]<<endl;
    }
    return 0;
}

N poj 2533

最长公共子序列长度

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
#define maxn 201
int ma[1000];
int dp[1000];
int main()
{
    //freopen("input.txt","r",stdin);
    int n=0;
    string s1,s2;
    while(cin>>n)
    {
        int ans=1;
       for(int i=0;i<n;i++)
       {
           cin>>ma[i];
       }
       for(int i=0;i<n;i++)
        {
            dp[i]=1;
            for(int j=0;j<i;j++)
            {
                if(ma[i]>ma[j])
                {
                    if(dp[i]<dp[j]+1)
                    {
                        dp[i]=dp[j]+1;
                        ans=max(dp[i],ans);
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容