?? 最大符號匹配 動態規劃.txt
字號:
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
//最大符號匹配 動態規劃
/*
輸入:
([][][)
(])(
((()))
[][][]
輸出:
6
2
6
6
*/
#define NMAX 102
int f[NMAX][NMAX];//f[i][j],從第i位到第j位子串的匹配情況
char str[NMAX];//將shuru[]后移一位得道,str[0]不用,方便寫轉移方程
char shuru[NMAX];
void print(int num)
{ //調試時打印f[][]
int i,j;
for(i=1;i<=num;i++) cout<<i<<" ";
cout<<endl;
for(i=1;i<=num;i++)
{
for(j=1;j<=num;j++)
cout<<f[i][j]<<" ";
cout<<endl;
}
cout<<endl;
system("pause");
}
int cal(int num)
{
int i,j,max,k,m;
memset(f,0,sizeof(f));
for(i=1;i<=num;i++) f[i][i]=0;
for(i=1;i<num;i++)
{
if((str[i]=='('&&str[i+1]==')')||(str[i]=='['&&str[i+1]==']'))
f[i][i+1]=1;
}
for(k=3;k<=num;k++)
{//要枚舉的字符串長度
for(i=1;i<=num-k+1;i++)
{//要枚舉的字符串的起始位置
j=i+k-1;//結束位置
max=f[i][j-1];
if(str[j]==')'||str[j]==']')
{ //這種情況才可能增加匹配數
for(m=i;m<j;m++)
{//枚舉要與末括號匹配的括號位置
if(m>i)
{//如果m不是首位,max由三部分組成(1+str[m]之前+str[m]之后的匹配數)
if((str[m]=='('&&str[j]==')')||(str[m]=='['&&str[j]==']'))
{
if(max<1+f[i][m-1]+f[m+1][j-1])
max=1+f[i][m-1]+f[m+1][j-1];
}
else if(max<f[i][m-1]+f[m+1][j-1]) max=f[i][m-1]+f[m+1][j-1];
}
else
{//如果m是首位,max由兩部分組成(1+str[m]之后的匹配數)
if((str[m]=='('&&str[j]==')')||(str[m]=='['&&str[j]==']'))
{
if(max<1+f[m+1][j-1])
max=1+f[m+1][j-1];
}
else if(max<f[m+1][j-1]) max=f[m+1][j-1];
}
}
}
f[i][j]=max;
}
}
// print(num);
return f[1][num];
}
int main()
{
int i,num;
scanf("%s",&shuru);
while(strcmp(shuru,"end")!=0)
{
num=strlen(shuru);
i=0;
str[0]='s';
do
{
str[i+1]=shuru[i];
i++;
}while(shuru[i-1]!='\0');
cout<<2*cal(num)<<endl;
scanf("%s",&shuru);
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -