poj2955 区间DP
Posted 文竹balala
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2955 区间DP相关的知识,希望对你有一定的参考价值。
题意:
求一个字符串最多有多少个字符括号可以相互匹配
分析:
很容易想到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;
以上是关于poj2955 区间DP的主要内容,如果未能解决你的问题,请参考以下文章