poj 1141
簡(jiǎn)單的dp
忘了\n,調(diào)了半天(目測(cè)不是第一次了)
直接貼代碼:
#include<cstdio>
#include<cstring>
using namespace std;
?
char s[120];
int dp[120][120]={0};
int min(int x,int y){
???????? return (x>y)?y:x;
}
void solve(int x,int y){
???????? if(dp[x][y]==0){
?????????????????? for(int i=x;i<=y;i++)
??????????????????????????? printf("%c",s[i]);
?????????????????? return;
???????? }
???????? if(y==x){
?????????????????? if(s[x]=='(' || s[x]==')')printf("()");
?????????????????? if(s[x]=='[' || s[x]==']')printf("[]");
?????????????????? return;
???????? }
???????? if((s[x]=='(' && s[y]==')' || s[x]=='[' && s[y]==']') && dp[x][y]==dp[x+1][y-1]){
?????????????????? printf("%c",s[x]);
?????????????????? solve(x+1,y-1);
?????????????????? printf("%c",s[y]);
?????????????????? return;
???????? }
???????? for(int i=x;i<y;i++)
?????????????????? if(dp[x][y]==dp[x][i]+dp[i+1][y]){
??????????????????????????? solve(x,i);
??????????????????????????? solve(i+1,y);
??????????????????????????? return;
?????????????????? }
???????? return;
}
int main(){
???????? gets(s);
???????? int l=strlen(s);
???????? for(int i=0;i<l;i++)dp[i][i]=1;
???????? for(int i=1;i<l;i++)
?????????????????? for(int j=0;j<l-i;j++){
??????????????????????????? int a=j,b=j+i;
??????????????????????????? dp[a][b]=200;
??????????????????????????? if(s[a]=='(' && s[b]==')' || s[a]=='[' && s[b]==']')dp[a][b]=dp[a+1][b-1];
??????????????????????????? for(int k=a;k<b;k++)
???????????????????????????????????? dp[a][b]=min(dp[a][b],dp[a][k]+dp[k+1][b]);
?????????????????? }
/*???? for(int i=0;i<l;i++){
?????????????????? for(int j=0;j<l;j++)
??????????????????????????? printf("%d ",dp[i][j]);
?????????????????? printf("\n");
???????? }*/
???????? solve(0,l-1);
???????? printf("\n");
???????? return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/shanquan2/p/3165929.html
總結(jié)
- 上一篇: Ubuntu13.04 配置smb服务器
- 下一篇: Linq let Concat