Codeforces Round #455 (Div. 2) C. Python Indentation dp遞推
阿新 • • 發佈:2017-12-28
air 方式 gpo pac sin -s font its 多少
Codeforces Round #455 (Div. 2)
C. Python Indentation
題意:python 裏面,給出 n 個 for 循環或陳述語句,‘f‘ 裏面必須要有語句。按 python 縮進的方式組合成合法的程序,問有多少種可能方案。
tags: dp
dp[i][j] 表示第 i 個語句縮進為 j 時的可能方案數, 轉移:
1】 如果第 i 個是 ‘f‘ , 則第 i+1 個肯定要比第 i 個多縮進一個單位,即 dp[i+1][j] = dp[i][j]。
2】如果第 i 個是 ‘s‘ ,則第 i+1 個可以屬於前面任何一個 for 循環,也就是說第 i+1 個的縮進要 <= 第 i 個的縮進,即 dp[i+1][j] = dp[i][k], j<=k<=n 。
復雜度 O(n^2)。
#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 #definePB push_back #define fi first #define se second typedef long long ll; const int N = 5005, mod = 1e9+7; int n; ll dp[N][N]; char ch; int main() { scanf("%d", &n); dp[1][0] = 1; rep(j,1,n) dp[1][j]=0; rep(i,1,n-1) { scanf("%*c%c", &ch); if(ch==‘f‘) { dp[i+1][0] = 0; rep(j,0,n) { dp[i+1][j+1] = dp[i][j]; } } else { ll sum = 0; per(j,n,0) { sum += dp[i][j]; sum %= mod; dp[i+1][j] = sum; } } } scanf("%*c%c", &ch); ll ans = 0; rep(j,0,n) ans += dp[n][j], ans %= mod; printf("%lld\n", ans); return 0; }
Codeforces Round #455 (Div. 2) C. Python Indentation dp遞推