这个方程有两种形式,本文采用
if(s[i]=s[j]) dp[i][j]=d[i-1][j-1]
dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j)
其实与另一种方法比较:根据j的所有匹配情况取最小值
1.i到j无匹配,取为dp[i][j-1]+1
2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j]
取上述所有情况最小值
两者都能获得正确的结果。
同时两者的初始化为 dp[i][j]==1 if(i==j)
规划方向为:
(1) (2) (3) (4)填写顺序
1 | (1) | (3) | (6) | (10) |
1 | (2) | (5) | (9) | |
1 | (4) | (8) | ||
1 | (7) | |||
1 |
// ConsoleApplication8.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<string> #include<memory.h> using namespace std; #define min(x,y) (x < y ? x : y) bool isEqual(char c,char b) { if(c=='('&&b==')') return true; if(c=='['&&b==']') return true; return false; } int main() { int dp[102][102]; int len; cin>>len; while(len--) { string a; cin>>a; int len=a.length(); memset(dp,0,sizeof(dp));//clear dp[0][0]=1; for(int i=1;i<len;i++) { dp[i][i]=1; for(int j=i-1;j>=0;j--) { dp[j][i]=100000; if(isEqual(a[j],a[i])) { dp[j][i]= min(dp[j][i],dp[j+1][i-1]); } for(int k=j;k<i;k++) { dp[j][i]=min(dp[j][k]+dp[k+1][i],dp[j][i]); } } } cout<<dp[0][len-1]<<endl; } }
// ConsoleApplication8.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<string> #include<memory.h> using namespace std; #define min(x,y) (x < y ? x : y) bool isEqual(char c,char b) { if(c=='('&&b==')') return true; if(c=='['&&b==']') return true; return false; } int main() { int dp[102][102]; int len; cin>>len; while(len--) { string a; cin>>a; int len=a.length(); memset(dp,0,sizeof(dp));//clear // cout<<dp[45][56]<<endl; dp[0][0]=1; dp[1][1]=1; for(int i=2;i<=len;i++) { dp[i][i]=1; for(int j=i-1;j>=1;j--) { dp[j][i]=dp[j][i-1]+1; //没有匹配的情况 for(int k=j;k<i;k++) { if(isEqual(a[k-1],a[i-1])) { dp[j][i]= min(dp[j][i],dp[j][k-1]+dp[k+1][i-1]); } } } } cout<<dp[1][len]<<endl; } }