動態規劃(3)-------區間DP

補了倆天,總算把線性DP寫了一半,剩下的等抽個時間慢慢寫。
區間dp就是在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp算法。(個人覺得所有的DP都是很美的暴力枚舉…)

石子合併

//這裏有一個板子的思路供大家參考

for(int len = 1;len<=n;len++)    //枚舉長度
{
        for(int j = 1;j+len<=n+1;j++)    //枚舉起點,ends<=n
        {
            int start=j;int ends = j+len - 1;
            for(int i = start;i<ends;i++)    //枚舉分割點,更新小區間最優解
            {
                dp[start][ends] = min(dp[start][ends],dp[start][i]+dp[i+1][ends]+something);
            }
        }
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=310;

int n;
int s[N];
int  f[N][N];
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>s[i];
    for(int i=1;i<=n;i++)s[i]+=s[i-1];

    for(int len=2;len<=n;len++)
    {
        for(int i=1;i+len-1<=n;i++)
        {
            int l=i,r=i+len-1;
            f[l][r]=1e8;
            for(int k=l;k<r;k++)
               f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
        }
    }
    cout<<f[1][n]<<endl;
    return 0;
}

後續的練習題等找個時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章