タイトル説明
一度だけ、各村の総NNN村横切る山岳地帯における道路の建設に政府、ないループのみへとから、この経路を介して任意の二つの村を横切ります。did_idi(正の整数)としても知られている任意の2つの隣接する村の間の距離、0 <I <N0 <I <N0 <I <N。山の文化的な品質を改善するために、政府はNNNの村からMMM村の小学校を建設することを決定しました。MMM、NNN与えられた距離に応じて、すべての隣接の村最寄りの村小学校最小限に距離のすべての合計を作る、村に建設され、選択された小学校、最小値が計算されます。。
出力フォーマット
最寄りの学校への最短距離に村。
入力形式
第一動作及びN M、空間の隙間。
第2の行n-1の整数は、順次隣接村、整数間隔の間の空間の一端から他端までの距離を表します。
最寄りの学校への最短距離に村。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=505;
int a[N],dp[N][N],f[N][N];
signed main(){
int n,m; cin>>n>>m;
for(int i=2;i<=n;i++)scanf("%d",&a[i]),a[i]+=a[i-1];
for(int l=1;l<=n;l++)
for(int r=l;r<=n;r++){
int mid=(l+r)>>1;
for(int k=l;k<=r;k++)
f[l][r]+=abs(a[mid]-a[k]);
}
memset(dp,0x7f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
if(j>i){dp[i][j]=0;continue;}
for(int k=j-1;k<=i;k++){
dp[i][j]=min(dp[i][j],dp[k][j-1]+f[k+1][i]);
}
}
cout<<dp[n][m]<<endl;
}