code1319 玩具裝箱

來源:互聯網
上載者:User

標籤:

一個劃分dp,不過由於劃分個數任意,僅用一維數組就可以

設dp[i]表示前i個裝箱(任意個箱子)的費用最小值

dp[i]=min(dp[u]+cost(u+1,i))

但是n<=50000,n方的複雜度顯然不能接受

設choice[i]數組存下對於每個i值,枚舉所得的使f[i]最大的那個u值

打表,發現choice[]是單調不下降的

則每次對於一個新的i,在枚舉u時只需要從choice[i-1]開始即可

代碼:

#include<iostream>#include<cstring>#define Size 50005using namespace std;int n;int c[Size];long long sum[Size];long long L;long long dp[Size];int choice[Size];long long cost(int l,int r){    long long x=sum[r]-sum[l-1] + r-l;    return (x-L)*(x-L);}int main(){    freopen("1319.in","r",stdin);     memset(dp,0x7f,sizeof(dp));        cin>>n>>L;    for(int i=1;i<=n;i++){        cin>>c[i];        sum[i]=sum[i-1]+c[i];     }        dp[0]=0;    choice[0]=0;     for(int i=1;i<=n;i++){        for(int u=choice[i-1];u<=i-1;u++){            if(dp[u]+cost(u+1,i)<=dp[i]){                dp[i]=dp[u]+cost(u+1,i);                choice[i]=u;            }                    }    }        cout<<dp[n];         fclose(stdin);     return 0;} 

 

至於更好的nlgn的二分最佳化和n的斜率最佳化,改天再說吧...sleeping

code1319 玩具裝箱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.