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. 【SVN】SVN Working copy is too old

    前天在使用 SVN 客户端 CornerStone 的时候遇到了这个问题,代码不能提交了…… 遇到这个问题的时候怎么办? 解决办法: 找到报错对应的文件夹,里面有个 .svn 的文件夹,去掉再 com ...

  2. 腾讯位置服务API快速入门

    前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key https://lbs.qq.com/guides/startup. ...

  3. JDBC连接池-C3P0连接

    JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版      c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池  三种方 ...

  4. hashCode和equals的区别

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写has ...

  5. 【Java例题】2.8 解一元二次方程

    8.解一元二次方程. 输入一元二次方程的a,b,c三个系数,解一元二次方程 ax^2+bx+c=0,输出两个根 package study; import java.util.Scanner; pub ...

  6. 利用反射,更改string对象的value数组以达到改变string值。

    package test; import java.lang.reflect.Field; import lombok.Value; public class Test1{ public static ...

  7. 【KakaJSON手册】06_Model转JSON

    前面的文章介绍了如何利用KakaJSON进行JSON转Model,从这篇文章开始介绍如何将Model转成JSON 生成JSON和JSONString struct Car: Convertible { ...

  8. web项目jsp中无法引入js问题

    https://blog.csdn.net/C1042135353/article/details/80274685#commentBox 这篇文章超赞的,几个小时的时间看了这篇文章豁然开朗,瞬间懂了 ...

  9. 如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他

    注册中心作用 开篇首先想思考一个问题,没有注册中心 Dubbo 还能玩下去吗? 当然可以,只要知道服务提供者地址相关信息,消费者配置之后就可以调用.如果只有几个服务,这么玩当然没问题.但是生产服务动辄 ...

  10. PythonI/O进阶学习笔记_2.魔法函数

    前言: 本文一切观点和测试代码是在python3的基础上. Content: 1.什么是魔法函数,魔法函数__getitem__在python中应用. 2.python的数据模型和数据模型这种设计对p ...