Educational DP Contest N - Slimes(区间dp)
N - Slimes
原题链接:https://atcoder.jp/contests/dp/tasks/dp_n
题目大意:
石子合并问题。
解题思路:
区间dp就是先维护小区间,在扩展到大的区间。
代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 #define debug(a) cout<<#a<<":"<<a<<endl;
5 const ll INF=0x3f3f3f3f3f3f3f3f;
6 const ll N=1e6+7;
7 const ll mod=1e9+7;
8 ll maxn,minn;
9 ll T,n,m;
10 ll arr[N];
11 ll sum[N];
12 ll dp[500][500];
13
14 int main(){
15 ll a,len,flag;
16 ll ans=0;
17 memset(dp,INF,sizeof(dp));
18 cin>>n;
19 sum[0]=0;
20 for(int i=1;i<=n;i++){
21 scanf("%lld",arr+i);
22 sum[i]=sum[i-1]+arr[i];
23 dp[i][1]=0;
24 }
25 for(int i=2;i<=n;i++){
26 for(int j=1;j<=n-i+1;j++){
27 for(int k=1;k<i;k++){
28 dp[j][i]=min(dp[j][i],dp[j][k]+dp[j+k][i-k]+sum[j+i-1]-sum[j-1]);
29 }
30 }
31 }
32 cout<<dp[1][n]<<endl;
33 return 0;
34 }