ICPC2017北京J題(Pangu and Stones)

鏈接:https://vjudge.net/problem/HihoCoder-1636
思路:區(qū)間dp,可以說是石子合并的加強版,只是因為由相鄰合并改為了一個范圍合并,所以我們要在原來dp上多加一維,dp[l][r][k]表示從l到r區(qū)間被分成k堆所需要的最小值,k=1時表示整個區(qū)間合并完成,狀態(tài)表示如下:
k>2 dp[l][r][k] = min(dp[l][r][k],dp[l][d][1]+dp[d+1][r][k-1])
k=1 dp[l][r][1] = min(dp[l][r][1],dp[l][r][k]+sum(r)-sum(l-1))
巧妙的地方就是把答案放到k=1的地方去,這樣我們只用在合并的時候加上前綴和,也算是一個套路吧,分解區(qū)間的時候不加前綴和,因為之前的都已經(jīng)算好了,合并的時候更新當(dāng)前狀態(tài)的最優(yōu)解,加上前綴和。
代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,L,R;
const int maxn = 500;
const ll INF = 1e18;
ll dp[maxn][maxn][maxn];
ll sum[maxn];
int a[maxn];

int main(){
    while(~scanf("%d%d%d",&n,&L,&R)){
        sum[0] = 0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum[i] = sum[i-1] + a[i];
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    dp[i][j][k] = INF;
                }
            }
        }
        for(int i=0;i<=n;i++)dp[i][i][1] = 0;
        for(int len=2;len<=n;len++){
            for(int l=1;l+len-1<=n;l++){
                int r = l+len-1;
                for(int p=2;p<=len;p++){//枚舉大于1的情況
                    for(int k=l;k<r;k++){//拆分區(qū)間
                            dp[l][r][p] = min(dp[l][r][p],dp[l][k][1]+dp[k+1][r][p-1]);
                    }
                }
              //將最優(yōu)解合并到k=1的時候,更新當(dāng)前狀態(tài)的最優(yōu)解
                for(int k=0;k<=n;k++){
                    if((k>=L&&k<=R)||(k==0&&len>=L&&len<=R))
                    dp[l][r][1] = min(dp[l][r][1],dp[l][r][k]+sum[r]-sum[l-1]);
                }
            }
        }
        printf("%lld\n",dp[1][n][1]>=INF?0:dp[1][n][1]);
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,929評論 0 33
  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國旗問題二分查找搜索BFSDFSBacktracking分治動態(tài)...
    第六象限閱讀 4,905評論 0 0
  • 《迪森安全俠》劉金: ????春季"奮斗者"號 ?? 啟動第十四周?? ! ? 5月26日? "安全無終點,教育...
    迪森劉金閱讀 287評論 0 0
  • 她不停的往我的肚子里放進新的住客 ,從最初的秋刀魚到最后的阿里。 我是一臺冰箱,會講故事的冰箱,阿里稱呼我為老票子...
    莫兜i閱讀 382評論 0 1

友情鏈接更多精彩內(nèi)容