1. 程式人生 > >Codeforces Round #455 (Div. 2) C. Python Indentation dp遞推

Codeforces Round #455 (Div. 2) C. Python Indentation dp遞推

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
#define
PB 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遞推