補了倆天,總算把線性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;
}
後續的練習題等找個時間。