区间dp专题
HDU4283You Are the One区间dp,
记忆话搜索运行时间:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 105,inf = 1<<30;
int dp[maxn][maxn][maxn],arr[maxn],n;
int solve(int s,int e,int k){
if( s == e)return arr[s] * (k-1);
if( s > e)return 0;
if(dp[s][e][k] != inf)return dp[s][e][k]; for(int i = s; i <= e; i++){ //将区间[s,e]划分为[s,i],[i+1,e]
int nextk = k+(i-s)+1; //[i+1,e]区间内第i个人第nextk个出栈
int thisk = k+(i-s); //[s,i]区间的第s个人第thisk个出栈
int first = solve(s+1,i,k); //第1个区间经过分配得到最少屌丝值
int second = solve(i+1,e,nextk); //第2个区间经过分配得到的最少屌丝值
int cur = arr[s] * (thisk-1); //第s个人第thisk出栈增加的屌丝值
dp[s][e][k] = min(dp[s][e][k],cur+second+first);
}
return dp[s][e][k];
}
int main(){
int t,cas = 1;
scanf("%d",&t);
while( t-- ){
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",arr+i);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
for(int k = 0; k <= n; k++)
dp[i][j][k] = inf;
printf("Case #%d: %d\n",cas++,solve(1,n,1)); }
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn =105;
const int inf = 1<<30;
int dp[maxn][maxn],arr[maxn],sum[maxn];
int n;
int solve_dp(){
for(int len = 1; len < n; len++){ //枚举区间长度
for(int s = 1; s + len <= n; s ++){ //枚举区间起点
int end = s+len; //s为区间头,end为区间尾
for(int k = s; k <= end; k++){ //第k个出栈
int tp = arr[s] * (k-s);
tp += dp[s+1][k] + dp[k+1][end];
tp += (k-s+1) * (sum[end] - sum[k]);//重要的性质,如果第i个人第k个出栈,那么后面的人出栈顺序都大于k
dp[s][end] = min(dp[s][end],tp);
}
}
}
return dp[1][n];
}
int main(){
int t,cas = 1;
scanf("%d",&t);
while( t-- ){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",arr+i);
sum[i] = sum[i-1] + arr[i];
}
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++)
for(int j = i+1; j <= n; j++)
dp[i][j] = inf;
printf("Case #%d: %d\n",cas++,solve_dp());
}
return 0;
}
经典的区间DP模型--最大括号匹配数。如果找到一对匹配的括号[xxx]oooo,就把区间分成两部分,一部分是xxx,一部分是ooo,然后以此递归直到区间长度为1或者为2.
状态转移方程:if(mach(j,j+i))dp[j][j+i] = dp[j+1][j+i-1]+2;
dp[j][j+i] = max(dp[j][k],dp[k+1][j+i])(j <= k < j+i)
/*
** 一种自底向上型的DP
** 状态转移方程:if(mach(j,j+i))dp[j][j+i] = dp[j+1][j+i-1]+2;
** dp[j][j+i] = max(dp[j][k],dp[k+1][j+i])(j <= k < j+i)
*/
#include <stdio.h>
#include <cstring>
#define Max(a,b) (a)>(b)?(a):(b)
#define maxn 101
int dp[maxn][maxn];
char str[maxn];
int main()
{
while(~scanf("%s",str)) {
if(strcmp(str,"end") == 0)break;
int len = strlen(str);
memset(dp,0,sizeof(dp));
for(int i = 1; i <= len; i++) {//枚举区间长度
for(int j = 0; j <= len - i; j++) {//枚举起点
dp[j][j+i] = dp[j+1][j+i-1] ;
if((str[j] == '(' && ')'== str[j+i]) || (str[j] =='[' && str[j+i] == ']' ))
dp[j][j+i] += 2;
for(int k = j; k < i+j; k++)//枚举区间j->j+i的分界点
dp[j][j+i] = Max(dp[j][j+i],dp[j][k]+dp[k+1][j+i]);
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
Light OJ 1422 Halloween Costumes
很基础的区间DP,是不老传说那题的减弱版。
状态转移方程:
dp[s][e] = dp[s][e-1] (arr[s] == arr[e]).dp[s][e] = dp[s][e-1]+1 (arr[s] != arr[e]) ;
dp[s][e] = min(dp[s][e] ,dp[s][k]+dp[k+1][e]);(arr[s] == arr[k] && s <= k < e )
dp[s][e] = min(dp[s][e] ,dp[s][k]+dp[k+1][e]+1);(arr[s] != arr[k] && s <= k < e)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 110;
int dp[maxn][maxn],arr[maxn];
int main()
{
int t,cas = 1,n;
scanf("%d",&t);
while( t-- ) {
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&arr[i]);
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++)dp[i][i] = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n-i; j++) {
dp[j][j+i] = dp[j][j+i-1];
if(arr[j] != arr[j+i])dp[j][j+i]++;//当起点和终点不同时衣服数量加1
for(int k = j; k < j+i; k++) {
if(arr[j] == arr[k])
dp[j][j+i] = min(dp[j][j+i],dp[j][k]+dp[k+1][j+i]);//当第j和第k相等时,衣服数量等于(j->k) + (k+1->j+i)
else
dp[j][j+i] = min(dp[j][j+i],dp[j][k]+dp[k+1][j+i]+1);//当j和k不相等时,衣服数量等于(j->k) + (k+1->j+i) + 1
}
}
printf("Case %d: %d\n",cas++,dp[1][n]);
}
return 0;
}
区间dp专题的更多相关文章
- 区间dp专题练习
区间dp专题练习 题意 1.Equal Sum Partitions ? 这嘛东西,\(n^2\)自己写去 \[\ \] \[\ \] 2.You Are the One 感觉自己智力被吊打 \(dp ...
- kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)
Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7949 Accepted: 42 ...
- 「kuangbin带你飞」专题二十二 区间DP
layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...
- [kuangbin带你飞]专题二十二 区间DP
ID Origin Title 17 / 60 Problem A ZOJ 3537 Cake 54 / 105 Problem B LightOJ 1422 Hallowee ...
- 专题训练之区间DP
例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...
- UESTC 2015dp专题 A 男神的礼物 区间dp
男神的礼物 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descri ...
- 【专题】区间dp
1.[nyoj737]石子合并 传送门:点击打开链接 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这 ...
- P1040 加分二叉树 区间dp
题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...
- dp专题训练
****************************************************************************************** 动态规划 专题训练 ...
随机推荐
- 洛谷 P3387 题解
题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是“YES”,是“YE5”: 2.不是“NO”,是“N0”:(是零 ...
- 阿里技术面全A,终面却被产品经理拉下马。。。
大纲: 一.投递简历 二.准备面试 三.技术一面 四.健身房里的技术二面 五.产品经理的死亡三面 六.总结 一.投递简历 找内推.大公司投简历尽量找内推,无论是校招还是社招.校招可以去牛客网或知乎找, ...
- 【iOS】打印方法名
为了便于追踪程序运行过程,可以在日志打印方法名,示例代码如下: NSLog(@"%@", NSStringFromSelector(_cmd)); 结果如图所示: 此外,在多个中, ...
- Codis与RedisCluster的原理详解
背景介绍 我们先来看一下为什么要做集群,如果我们要部署一个单节点Redis,很明显会遇到单点故障的问题. 首先能想到解决单点故障的方法,就是做主从,但是当有海量存储需求时,单一的主从结构就会出问题,说 ...
- 自定义SWT控件一之自定义单选下拉框
一.自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失. package co ...
- 在.NET CORE中使用配置文件:对 ConfigurationBuilder 的使用说明
示例:ASP.NET MVC 使用示例: 如何覆写默认行为?如取消热更新支持,方法如下: 示例:控制台 使用应用程序参数 使用键值对枚举(这里以字典来说明) 使用JSON文件 注册配置文件中的某一个段 ...
- Linux基础进程管理
一.进程 了解如进程的: • PID,PPID • 当前的进程状态 • 内存的分配情况 • CPU和已花费的实际时间 • 用户UID,他决定进程的特权 (一).静态查看进程 # ps axu | le ...
- 记一次使用LR测试UDP和TCP的过程
背景 最近项目要做性能测试,要出要一份性能报告,让我出一个有关Tcp和Udp的功能模块的测试,流程大概是这样,先走TCP协议协商一下会话,协商成功后走Udp收发数据. 有点简单啊,自己写个功能模块测一 ...
- 客户端埋点实时OLAP指标计算方案
背景 产品经理想要实时查询一些指标数据,在新版本的APP上线之后,我们APP的一些质量指标,比如课堂连接掉线率,课堂内崩溃率,APP崩溃率等指标,以此来看APP升级之后上课的体验是否有所提升,上课质量 ...
- 带你剖析WebGis的世界奥秘----瓦片式加载地图
WebGIS应用程序的页面能够通过HTML.JSP.ASP或任何任何类型的Web页文件构成,其特殊之处在于,它的请求提交的方法并不是通过常用的 "超链接"形式,而是使用鼠标与Web ...