自己看之区间DP

//菜鸡制作,看的时候可能三目运算符略烦;;;

区间DP入门题:Brackets

地址:http://59.77.139.92/Problem.jsp?pid=1463

分析(对区间DP的代码原理进行分步解析):

 1 for(k=1; k<L; k++)
 2 {
 3     for(i=0, j=k; j<L; i++, j++)
 4     {
 5         if(s[i]==‘[‘&&s[j]==‘]‘||s[i]==‘(‘&&s[j]==‘)‘)
 6             dp[i][j]=dp[i+1][j-1]+2;
 7         for(x=i; x<j; x++)
 8             dp[i][j]=max(dp[i][j], dp[i][x]+dp[x+1][j]);
 9     }
10 }

样例:()()()

变量是一一对应的应该;

区间DP原理就可以理清楚了。

然后我们看一下这题:刺激的摩托飞艇

地址:http://59.77.139.92/Problem.jsp?pid=2382

这一题求最小拆除路线实际上就是求最大不相交路线的数量, 也就是和上面那一题一模一样,但是这一题变通的地方在于dp数组一开始就要赋值,相连则dp[i][j]=1, 其他的地方完全可以照搬

 1 #include<stdio.h>
 2 #define max(a, b) a>b?a:b
 3 int n, i, j, k, l, dp[110][110], a;
 4 int main( )
 5 {
 6     scanf("%d", &n);
 7     while(n--)
 8         scanf("%d%d", &j, &k), j>k?dp[k][j]=1:dp[j][k]=1;
 9     for(k=2, n=101; k<n; k++)
10         for(i=1, j=k; j<n; j++, i++)
11         {
12             for(l=i+1, a=0; l<j; l++)
13                 a=max(a, dp[i][l]+dp[l][j]);
14             dp[i][j]+=a;
15         }
16     printf("%d\n", dp[1][100]);
17 }

例三:石子合并

地址:http://59.77.139.92/Problem.jsp?pid=2385

这一题的区别点就是石子是环状的,那么我们就可以简单的对数组进行延长操作来求, 其他核心基本上不变

 1 #include<stdio.h>
 2 #define min(a, b) a<b?a:b
 3 int dp[605][605], i, j, k, l, n, a[605], sum[605];
 4 int main( )
 5 {
 6     scanf("%d", &n);
 7     for(i=0; i<n; i++)
 8         scanf("%d", &a[i]), i?sum[i]=a[i]+sum[i-1]:sum[i]=a[i];///sum数组记录前缀和
 9     for(i=n; i<2*n; i++)
10         a[i]=a[i-n], sum[i]=sum[i-1]+a[i];///增长
11     for(k=1; k<n; k++)
12         for(i=0, j=k; j<2*n; i++, j++)
13             for(l=i, dp[i][j]=0x3f3f3f; l<j; l++)
14                 dp[i][j]=min(dp[i][j], dp[i][l]+dp[l+1][j]+sum[j]-sum[i-1]);
15     for(i=0, j=0x3f3f3f; i<n; i++)
16         if(j>dp[i][i+n-1]&&dp[i][i+n-1])
17             j=dp[i][i+n-1];
18     printf("%d\n", j);
19 }
时间: 2024-10-19 11:14:29

自己看之区间DP的相关文章

qscoj 喵哈哈村的打印机游戏 区间dp

点这里去看题 区间dp ,dp[l][r][d]代表从l到r的区间底色为d,具体看代码 第一次见到区间dp...两个小时对着敲了五遍终于自己敲懂了一遍ac #include<bits/stdc++.h> using namespace std; int dp[55][55][55]; string s; int solve(int l,int r,int d) { if(l>r)return 0; if(l==r&&s[l]-'A'==d)return dp[l][r][

算法复习——区间dp

感觉对区间dp也不好说些什么直接照搬讲义了2333 例题: 1.引水入城(洛谷1514) 这道题先开始看不出来到底和区间dp有什么卵关系···· 首先肯定是bfs暴力判一判可以覆盖到哪些城市····无解直接输出···有解得话就要想想了···· 这道题关键是要发现··如果一个蓄水池所在城市可以覆盖到一些沙漠城市···那么这些沙漠城市肯定是一段····不然假设有一个城市是断开的而两边都被同一个蓄水池流出的水覆盖,这个城市四周的城市都肯定比它矮···(不理解举个反例吧···反正我举不出来)···然后就

lightoj1031_区间dp

题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 题目描述: 给出一个数列,两人轮流取数, 取完结束.每次可以取好多个数,但是只能从首或者尾为起点取连续的若干个.问最后两者取数和的绝对值最大为多少? 区间dp: 这道题我是在看了几份阶梯报告之后才想通的,现在想想很符合动态规划的要求 d(i, j)表示取数的人在数组i 到 j中能取的的最大值,然后中间枚举分割点, ans = max(ans, sum[k]-sum[i-1]-d

lightoj1025_区间dp

题目链接:http://lightoj.com/volume_showproblem.php?problem=1025 题目描述: 给出一个字符串,可以任意删除位置的字符,也可以删除任意多个.问能组成多少个回文串? 解题思路: 自从开始学dp,感觉自己智商一直处于离线状态.席八啊啊啊啊啊啊!今天随机到这个题目,看了好久竟然没有看出来是区间DP.知道是区间DP后立马感觉明白. 情景设定 dp[l][r] 表示 区间 [l, r] 内的回文串数目. 状态转移:dp[l][r] = dp[l][r-1

hdu 4570 Multi-bit Trie 区间DP入门

Multi-bit Trie 题意:将长度为n(n <= 64)的序列分成若干段,每段的数字个数不超过20,且每段的内存定义为段首的值乘以2^(段的长度):问这段序列总的内存最小为多少? 思路:区间的最值,区间DP; 枚举长度,在初始化时,将长度和20比较,小于20看成是一段,大于20时,因为不能压缩,直接全部分割就是了:之后枚举区间内部的所有值,这是并不需要考虑将这个区间一分为二后各自的长度是否大于20,因为在子结构中已经计算好了:直接去最优解即可: #include<iostream>

hdu 4412 Sky Soldiers(区间DP)

Sky Soldiers Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 559    Accepted Submission(s): 181 Problem Description An airplane carried k soldiers with parachute is plan to let these soldiers j

区间dp的感悟

学区间dp似乎也很久了...对区间dp的通用模型都了解了一些 但是做题还是很坑 上了一点难度的题基本想不出什么思路.. 目前的做题方式就是看题 想一会发现自己不会做 看题解 好巧妙啊 理解后写一发.. 还是准备记载一下自己对区间dp的一点感悟 区间dp很多枚举区间长度的做法 一般是n^3 好像数据范围都不会太大的样子 问题和区间有关 或者加一个完成xx的状态 预处理比较重要 一般是在dp数组上搞事情 也有一些题是利用dp数组搞预处理 hdu2476 就是这样的 题目的套路和普通dp不太一样 感觉

poj 3280(区间DP)

Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7869   Accepted: 3816 Description Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each cow a

【codevs2211】WJM2BMR安慰MM记 区间dp

事实上这道题的原型是1258——关路灯,为什么选了这个呢? 废话,因为题目呗= = 言规正传,觉得这道题扯到看不懂的可以去翻codevs1258,说的挺易懂的 其实就是一道区间dp,比较裸的代码,考虑清楚就好 记录过去和回来的最小安慰时间= = 贴代码 var n,c,i,j,sum:longint; m,w:array[0..1100] of longint; a,l,r:array[0..1005,0..1005] of longint; function min(a,b:longint):