• 区间DP


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

    区间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
    ",dp[0][N]);
    45     return 0;
    46 }
  • 相关阅读:
    Dom页面加载
    Redis
    Ubuntu下git的安装与使用
    类Xadmin插件--海豚插件
    Python基础指随笔
    前端必须掌握30个CSS3选择器
    SweetAlert插件示例
    Pylint在项目中的使用
    django Cookie、Session和自定义分页
    django创建超级用户
  • 原文地址:https://www.cnblogs.com/sykline/p/9737850.html
Copyright © 2020-2023  润新知