UVALive-8078 Bracket Sequence 簡單dp
阿新 • • 發佈:2018-08-25
mes ems none 組成 sub lse table == code
題目鏈接:https://cn.vjudge.net/problem/UVALive-8078
題意
括號序列T是這樣定義的:
- T是個空的
- T是(T), {T},
- T是兩個T組成的,比如()()就是一個T
現在給一個n個字符長的串,問以每個字符為左端點的最長括號序列是多長。
思路
顯然對i這個地方可以討論一下:
如果i是個右括號,答案是0。
如果i是個左括號:
如果以i+1為起點的最長串後邊的字符與左括號匹配,答案是加上這個字符後邊的最長串。
如果不匹配,答案是0。
細節上註意不要越界即可,邊界是dp[strlen]=0
提交過程
AC |
代碼
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=2e5; char str[maxn]; int sign[300], ans[maxn]; int main(void){ int T, kase=0; sign[‘(‘]=1; sign[‘{‘]=2; sign[‘[‘]=3; sign[‘<‘]=4; sign[‘)‘]=-1; sign[‘}‘]=-2; sign[‘]‘]=-3; sign[‘>‘]=-4; scanf("%d", &T); while (T--){ scanf("%s", str); memset(ans, 0, sizeof(ans)); int len=strlen(str); for (int i=len; i>=0; i--){ int elem=sign[str[i]]; if (elem<0) ans[i]=0; else{ if (i+1<len && sign[str[i+1]]==elem*-1) ans[i]=2+ans[i+2]; else if (i+1<len){ int nxt=sign[str[ans[i+1]+i+1]]; // printf("%d %d --\n", nxt, elem); if (nxt==elem*-1) ans[i]=ans[i+1]+2+ans[i+ans[i+1]+2]; else ans[i]=0; }else if (i+1>=len) ans[i]=0; } } printf("Case %d:\n", ++kase); for (int i=0; i<len; i++) printf("%d\n", ans[i]); } return 0; }
Time | Memory | Length | Lang | Submitted |
---|---|---|---|---|
49ms | None | 1116 | C++ 5.3.0 | 2018-08-24 11:28:32 |
UVALive-8078 Bracket Sequence 簡單dp