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 }

 

posted @ 2020-05-08 20:54  yya雨  阅读(360)  评论(0编辑  收藏  举报