poj2955,开始学习区间dp了

2023-12-24 18:38
文章标签 学习 dp 区间 poj2955

本文主要是介绍poj2955,开始学习区间dp了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:给出一个括号序列,求出其中匹配的括号数

((()))  6

()()()  6

([]])  4

)[)(   0

([][][)  6

第一步:确定状态
—dp[i][j]表示a[i]……a[j]的串中,有多少个已经匹配的括号
—第二步:确定状态转移方程
如果 a[i] a[k] 是匹配的
dp[ i ][j]= max(dp[ i ][j], dp[ i + 1][k - 1] + dp[k + 1][j] + 2)
(相当于是将 i j 分成 [ xxxxx ] xxxxx 两部分)
否则 dp[ i ][j] =max(dp[i][j],dp[ i +1][j])
(将第一个元素去掉 —— 因为它肯定不能算)
边界 dp[ i ][ i ] = 0.



如果用递推的话,应该是区间大小由小到大递增作为最外层循环
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int dp[105][105];
char a[105];
bool check(int i,int j)
{if(a[i]=='('&&a[j]==')') return true;if(a[i]=='['&&a[j]==']') return true;return false;
}
int main()
{int i,j,k,l;gets(a);while(a[0]!='e'){memset(dp,0,sizeof(dp));l=strlen(a);for(i=2;i<=l;i++)//枚举区间长度从2到lfor(j=0;j+i-1<l;j++)//枚举起始位置for(k=j+1;k<=j+i-1;k++) //枚举中间的kif(check(j,k))dp[j][j+i-1]=max(dp[j][j+i-1],dp[j+1][k-1]+dp[k+1][j+i-1]+2);elsedp[j][j+i-1]=max(dp[j][j+i-1],dp[j+1][j+i-1]);printf("%d\n",dp[0][l-1]);gets(a);}
}



#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[105][105];
char a[105];
int main()
{int i,j,len;gets(a+1);while(a[1]!='e'){a[0]=1;len=strlen(a)-1;memset(dp,0,sizeof(dp));for(i=len-1;i>=1;i--){for(j=i+1;j<=len;j++){dp[i][j]=dp[i+1][j];for(int k=i+1;k<=j;k++){if((a[i]=='('&&a[k]==')')||(a[i]=='['&&a[k]==']')){dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k+1][j]+2);}}}}printf("%d\n",dp[1][len]);gets(a+1);}return 0;
}






这篇关于poj2955,开始学习区间dp了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532752

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss