码迷,mamicode.com
首页 > 其他好文 > 详细

区间DP

时间:2018-10-02 22:22:35      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:ons   href   ems   数组   意思   方法   mes   const   str   

一场比赛让自己看到了学了这么长时间,竟然还有这么多落下的东西。

区间DP,通过先求小区间的最优解,然后通过小区间的最优解来得到大区间的最优解。

区间DP板子

 1 for(int len = 2; len <= N; len++)//枚举区间的长度,长度是从2开始的,从一开始是貌似没什么意思
 2     for(int st = 0; st < N; st++)//枚举区间的开始     //有的题目甚至还会出错,具体问题具体分析吧
 3     {
 4         int mmin = INF;//注意mmin的位置,mmin在这里求得每个区间长度中的最小值
 5         int en = st + len;//获得区间的结尾
 6         if(en > N) break;
 7         for(int k = st + 1; k < en; k++)
 8         {
 9             int t =dp[st][k] + dp[k][en] + cost[en] - cost[st];
10             mmin = min(mmin, t);
11         }
12         if(mmin != INF)
13             dp[st][en] = mmin;
14     }
15     //这里的cost用的是前缀和数组,注意前缀和数组的处理方法

另外就是区间DP是连续相邻的,一定要与哈夫曼区分开来(wa到吐血的教训)!!

附板子题链接(石子归并

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <set>
 6 #define INF 0x3f3f3f3f3f
 7 
 8 using namespace std;
 9 typedef long long ll;
10 const int maxn = 105;
11 int cost[maxn],dp[maxn][maxn];
12 int N;
13 
14 int main()
15 {
16     memset(cost, 0, sizeof(cost));
17     memset(dp, 0, sizeof(dp));
18     scanf("%d",&N);
19     for(int i = 1; i <= N; i++)
20     {
21         scanf("%d",&cost[i]);
22     }
23     cost[0] = 0;
24     for(int i = 1; i <= N; i++)
25     {
26         cost[i] = cost[i-1] + cost[i];
27         //printf("sum:%d  ",cost[i]);
28     }
29     for(int len = 2; len <= N; len++)//枚举区间的长度,长度是从2开始的,从一开始是貌似没什么意思
30     for(int st = 0; st < N; st++)//枚举区间的开始     //有的题目甚至还会出错,具体问题具体分析吧
31     {
32         int mmin = INF;//注意mmin的位置,mmin在这里求得每个区间长度中的最小值
33         int en = st + len;//获得区间的结尾
34         if(en > N) break;
35         for(int k = st + 1; k < en; k++)
36         {
37             int t =dp[st][k] + dp[k][en] + cost[en] - cost[st];
38             mmin = min(mmin, t);
39         }
40         if(mmin != INF)
41             dp[st][en] = mmin;
42     }
43     //这里的cost用的是前缀和数组,注意前缀和数组的处理方法
44     printf("%d\n",dp[0][N]);
45     return 0;
46 }

 

区间DP

标签:ons   href   ems   数组   意思   方法   mes   const   str   

原文地址:https://www.cnblogs.com/sykline/p/9737850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!