多校第七場ECNU 1006 HDU 3905 Sleeping (二維DP)

來源:互聯網
上載者:User

n個數,需要至少減掉m個數(不要求連續)。求所有剩餘連續的長度大於等於l的數串中的和的最大值

dp[i][j] 表示掃描第i個數已經已經去掉j個數,能獲得最大值。

首先,第i數可以去掉,那麼dp[i][j] = dp[i - 1][j - 1];

也可以不去掉,對於每個k( 0 <= k <= i - l),求的dp[k][j] + sum[i] - sum[k]的最大值,max{dp[i][j] = dp[i - 1][j - 1],dp[k][j] + sum[i] - sum[k]}就是當前的值。

直接枚舉k 代價o(n)會逾時,這裡需要利用另一個數組寄存一下,dp_tmp[i][j]存入dp[k][j] + sum[i] - sum[k]的最大值,這樣轉移dp_tmp[i][j]的方程為

dp_tmp[i][j]=max{dp_tmp[i-1][j]+sum[i]-sum[i-1],dp[i-l][j]+sum[i]-sum[i-l]} 

對於求的dp[k][j] + sum[i] - sum[k]的最大值的代價就將為o(1)。時間、空間都為o(n^2) 。

HDU 上跑了218ms

 

#include <cstdio>#include <cstring>#define max(a,b) (a)>(b)?(a):(b)#define min(a,b) (a)>(b)?(b):(a)const int maxn=1005;int n,m,l;int dp[maxn][maxn];//記錄目前狀態狀態 int dp_tmp[maxn][maxn];int sum[maxn];int i,j;int main (){    //freopen ("data.in","r",stdin);    //freopen ("out.txt","w",stdout);    while (~scanf("%d%d%d",&n,&m,&l))    {        memset(dp,0,sizeof(dp));        memset(dp_tmp,0,sizeof(dp_tmp));        if(m+l>n){printf("0\n");continue;}        sum[0]=0;        for (i=1 ; i<=n ; ++i)        {            scanf("%d",sum+i);            sum[i]+=sum[i-1];        }                for (i=1 ; i<=n ; ++i)        {            for (j=0 ; j<=m && j<=i ; ++j)            {                 dp[i][j]=dp[i-1][j];//初始化,轉移的意義是當前不睡覺但是不構成更大的分數                 if(j>0)dp[i][j]=max(dp[i][j],dp[i-1][j-1]);                if(i-j>=l)dp_tmp[i][j]=max(dp_tmp[i-1][j]+sum[i]-sum[i-1],dp[i-l][j]+sum[i]-sum[i-l]);                //printf("%d %d\n",dp_tmp[i-1][j]+sum[i]-sum[i-1],dp[i-l][j]+sum[i]-sum[i-l]);                if(i-l>=0)dp[i][j]=max(dp_tmp[i][j],dp[i][j]);                //printf("i=%d j=%d dp=%d,tmp=%d\n",i,j,dp[i][j],dp_tmp[i][j]);                            }        }        printf("%d\n",dp[n][m]);    }    return 0;}

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.