Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Codeforces Round #459 (Div. 2)
C. The Monster
題意:定義正確的括號串,是能夠全部匹配的左右括號串。 給出一個字符串,有 (、)、 ? 三種字符, ? 可以當作 ( 可 ) 。 問這個字符串有多少個子串是正確的括號串。
tags:好考思維,想不到。。
預處理出每個字符向左向右最多可以匹配到哪里,再 O(n*n) 枚舉所有區間,看是否符合條件。
// C #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 5005;int len, l[N], r[N]; char s[N]; int main() {scanf("%s", s+1);len = strlen(s+1);rep(i,1,len){r[i] = len+1;int cnt = 0;rep(j,i,len){if(s[j]==')') --cnt;else ++cnt;if(cnt<0) { r[i]=j; break; }}}per(i,len,1){l[i] = 0;int cnt = 0;per(j,i,1){if(s[j]=='(') --cnt;else ++cnt;if(cnt<0) { l[i]=j; break; }}}ll ans = 0;rep(i,1,len){for(int j=i+1; j<=len; j+=2){if(r[i]>j && l[j]<i) ++ans;}}printf("%lld\n", ans);return 0; } View Code?
D. MADMAX
題意:給出一個DAG圖,每條邊有一個字母。兩個人輪流走,每一次走過的邊不能小于對方上一步走過的邊。求兩個人分別從點 i、j 出發,先手的勝負。
tags: dp[i][j][pre] 表示先手在點 i,后手在點 j ,且上一步的邊是 pre 的情況下,先手勝就為 1,后手勝就為0 。
假設點 i 有邊edge 可以到 to ,那么如果有 dp[j][to][edge] = 0,則 dp[i][j][pre] = 1 。
如果沒有這樣的點 to,那么? dp[i][j][pre] = 0。
當然,dp 肯定要記憶化的。
// D #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 105;int n, m, G[N][N], dp[N][N][30], mx[N]; int solve(int i, int j, int pre) {if(dp[i][j][pre]!=-1) return dp[i][j][pre];if(i==j) return dp[i][j][pre]=0;if(mx[i]==-1) return dp[i][j][pre]=0;if(mx[i] > mx[j]) return dp[i][j][pre]=1;else{rep(to,1,n)if(G[i][to]!=-INF && G[i][to]>=pre){if(solve(j, to, G[i][to])==0) return dp[i][j][pre]=1;}}return dp[i][j][pre]=0; } int main() {scanf("%d%d", &n, &m);mes(dp, -1); mes(mx, -1);rep(i,1,n) rep(j,1,n) G[i][j]=-INF;int u, v; char ch;rep(i,1,m){scanf("%d%d%*c%c", &u, &v, &ch);G[u][v] = ch-'a'+1;}rep(i,1,n){int mx1=-1;rep(j,1,n) mx1=max(mx1, G[i][j]);mx[i] = mx1;}rep(i,1,n){rep(j,1,n)if(solve(i, j, 0)) putchar('A');else putchar('B');puts("");}return 0; } View Code轉載于:https://www.cnblogs.com/sbfhy/p/8394886.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器不学习:CNN 入门讲解1-什么是卷
- 下一篇: 桶排序(BucketSort)(java