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;
}
三个for循环
 
#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;
}

3、poj 2955 Brackets

经典的区间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专题的更多相关文章

  1. 区间dp专题练习

    区间dp专题练习 题意 1.Equal Sum Partitions ? 这嘛东西,\(n^2\)自己写去 \[\ \] \[\ \] 2.You Are the One 感觉自己智力被吊打 \(dp ...

  2. kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)

    Treats for the Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7949   Accepted: 42 ...

  3. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

  4. [kuangbin带你飞]专题二十二 区间DP

            ID Origin Title   17 / 60 Problem A ZOJ 3537 Cake   54 / 105 Problem B LightOJ 1422 Hallowee ...

  5. 专题训练之区间DP

    例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...

  6. UESTC 2015dp专题 A 男神的礼物 区间dp

    男神的礼物 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descri ...

  7. 【专题】区间dp

    1.[nyoj737]石子合并 传送门:点击打开链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这 ...

  8. P1040 加分二叉树 区间dp

    题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...

  9. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

随机推荐

  1. 【iOS】判断苹果的设备是哪种

    有时候需要判断苹果的设备是 iPhone 还是 iPad 等其他设备,示例代码如下: if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUs ...

  2. Linux 常见的常识及常用快捷键方式

    1.  ,请写出linux系统中常见一级目录的名称及作用. /root :   超级用户的家目录 /home:  普通用户的家目录 /boot:   启动目录,启动相关文件(系统内核启动文件) /de ...

  3. BootStrap实现简单响应式导航菜单

    用BootStrap实现响应式导航栏,我会对其中的一些样式进行说明.   先上代码,是一个很简单的Demo. <!doctype html> <html> <head&g ...

  4. [Short-Circuit Constraint Violation]警告解决办法

    今天用Altium Designer16画PCB时候遇到一个问题,进行DRC检测,警告如下: [Short-Circuit Constraint Violation] GrayscaleSensor1 ...

  5. 【Java例题】6.2 日期类的使用

    2.日期类的使用.显示今天的年月日.时分秒和毫秒数.显示今天是星期几.是今年内的第几天.显示本月共几天,今年是不是闰年.显示两个日期的差,包括年月日.时分秒和毫秒差值. package chapter ...

  6. git的使用学习笔记

    一.git Git 是一个开源的分布式版本控制系统,项目版本管理工具,可以在本地提交修改再合并到主分支上,最为出色的是它的合并跟踪(merge tracing)能力. 可以通过Linux命令进行增加, ...

  7. fiddler设置断点

    1.有两种方法设置断点 before response:也就是发送请求之后,但是Fiddler代理中转之前,这时可以修改请求的数据 after response:也就是服务器响应之后,但是在Fiddl ...

  8. Elasticsearch索引增量统计及定时邮件实现

    0.需求 随着ELKStack在应用系统中的数据规模的急剧增长,每天千万级别数据量(存储大小:10000000*10k/1024/1024=95.37GB,假设单条数据10kB,实际远大于10KB)的 ...

  9. kubernetes API服务器的安全防护

    12.1.了解认证机制 启动API服务器时,通过命令行选项可以开启认证插件. 12.1.1.用户和组 了解用户: 分为两种连接到api服务器的客户端: 1.真实的人 2.pod,使用一种称为Servi ...

  10. 【0806 | Day 9】异常处理/基本的文件操作

    一.异常处理 异常即报错,可分为语法异常和逻辑异常 1. 语法异常 举个栗子 if #报错 syntaxerror 0 = 1 #报错 syntaxerror ... 正经地举个栗子 print(1) ...