日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:

https://vjudge.net/problem/UVA-1626

題意:

題解:

dp[i][j]:= i~j需要最少的括號
區間dp:
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
if(match(s[i],s[j])) dp[i][j] = min(dp[i][j],dp[i+1][j-1]);

學到了一種dp打印解得方式

讀入真坑啊…

代碼:

1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 // 16 const int maxn = 1e5+10; 17 18 char s[maxn]; 19 int dp[105][105]; 20 21 bool match(char s1,char s2){ 22 if((s1=='(' && s2==')') || (s1=='['&&s2==']')) return true; 23 return false; 24 } 25 26 void print(int i,int j){ 27 if(i > j) return ; 28 if(i == j){ 29 if(s[i]=='(' || s[i]==')') printf("()"); 30 else printf("[]"); 31 return ; 32 } 33 int ans = dp[i][j]; 34 if(match(s[i],s[j]) && ans==dp[i+1][j-1]) { 35 printf("%c",s[i]); print(i+1,j-1); printf("%c",s[j]); 36 return ; 37 } 38 39 for(int k=i; k<j; k++){ 40 if(ans == dp[i][k]+dp[k+1][j]){ 41 print(i,k); print(k+1,j); 42 return ; 43 } 44 } 45 } 46 47 int main(){ 48 int T; 49 gets(s); 50 sscanf(s,"%d",&T); 51 gets(s); 52 53 while(T--){ 54 gets(s); 55 int n = strlen(s); 56 for(int i=0; i<n; i++){ 57 dp[i+1][i] = 0; 58 dp[i][i] = 1; 59 } 60 61 for(int len=1; len<n; len++){ 62 for(int i=0; i+len<n; i++){ 63 int j = i+len; 64 dp[i][j] = n; 65 if(match(s[i],s[j])) dp[i][j] = min(dp[i][j],dp[i+1][j-1]); 66 for(int k=i; k<j; k++){ 67 dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]); 68 } 69 } 70 } 71 72 print(0,n-1); 73 puts(""); 74 if(T) puts(""); 75 gets(s); 76 } 77 78 return 0; 79 }

?

轉載于:https://www.cnblogs.com/yxg123123/p/6827586.html

總結

以上是生活随笔為你收集整理的紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。