poj2955 区间DP
2016-02-12 16:16
357 查看
题意:
求一个字符串最多有多少个字符括号可以相互匹配
分析:
很容易想到dp,状态f[i][j]表示i到j最多可以匹配的字符数
状态转移方程:即要么给i从后边匹配一个字符串,要么不匹配i直接与f[i+1][j]相比较
if (a[i] == a[k]) f[i][j] = max(f[i][j], f[i+1][k-1] + f[k+1][j] + 2);
else dp[i][j] = max(dp[i][j], dp[i+1][j]);
求一个字符串最多有多少个字符括号可以相互匹配
分析:
很容易想到dp,状态f[i][j]表示i到j最多可以匹配的字符数
状态转移方程:即要么给i从后边匹配一个字符串,要么不匹配i直接与f[i+1][j]相比较
if (a[i] == a[k]) f[i][j] = max(f[i][j], f[i+1][k-1] + f[k+1][j] + 2);
else dp[i][j] = max(dp[i][j], dp[i+1][j]);
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define ll long long const int maxn = 105; char s[maxn]; int dp[maxn][maxn]; bool equals(char a, char b) { if ((a == '(' && b == ')') || (a == '[' && b == ']')) return true; else return false; } int main() { //freopen("input.txt", "r", stdin); while(scanf("%s", s) == 1) { if (strcmp(s, "end") == 0) break; memset(dp, 0, sizeof(dp)); int len = strlen(s); for (int w = 2; w <= len; w++) { for (int i = 0; i + w - 1 < len; i++) { int j = i + w - 1; for (int k = i+1; k <= j; k++) { if (equals(s[i], s[k])) dp[i][j] = max(dp[i][j], dp[i+1][k-1]+dp[k+1][j]+2); dp[i][j] = max(dp[i][j], dp[i+1][j]); } } } printf("%d\n", dp[0][len-1]); } return 0; }
相关文章推荐
- 初识前端模板引擎jade
- Android电话拨号器的实现
- java基础15迭代器
- ANDROID_MARS学习笔记_S02_003_AutoCompleteTextView
- C#成神之路<18> C#使用磁盘数据文件(2)
- ANDROID_MARS学习笔记_S02_002_Date\TimePicker
- Windows 安装 JDK 环境变量设置
- Directx下的Effect框架
- 1030. Travel Plan (30)
- Python 零碎信息-基础 01
- 侧滑SilidingMenu ,ViewPager 和,PagerIndicator 冲突
- 学习笔记4 Supervised Convolutional Neural Network 之 Convolution and Pooling
- Android开发随手记之一
- 第2章 python实战例子
- 【城会玩系列】hdu 5365 Run【计算几何相关】
- 【小作品】STM32无线WIFI视频小车制作剖析(上)
- durpal8+Acquia Dev Desktop安装问题处理
- UVa 253 Cube painting
- How to solve “Dynamic Web Module 3.1 requires Java 1.7 or newer” in Eclipse
- 排列组合 nbut1652 Coloring