标签: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 }
标签:ons href ems 数组 意思 方法 mes const str
原文地址:https://www.cnblogs.com/sykline/p/9737850.html