• Codeforces 909 C. Python Indentation (DP+树状数组优化)


    题目链接: Python Indentation

    题意:

      Python是没有大括号来标明语句块的,而是用严格的缩进来体现。现在有一种简化版的Python,只有两种语句:

     (1)'s'语句:Simple statements. 相当于一般语句。(2)'f'语句:For statements. 相当于for循环,并且规定它的循环体不能为空。

     然后给你一段没有缩进的Python程序,共n行(n <= 5000)。问你添加缩进后,有多少种合法且不同的Python程序。

    题解:题目解析

      DP过去,如果第i个位置是'f'的话,dp[i][j]只加到dp[i+1][j+1]上,如果是‘s’则可以加到从dp[i][0,j]的所有数上。区间假发可以用树状数组优化,把复杂度降到(n×n×log(n))。这道题让我发现long long操作要比int慢一倍左右,还有MOD操作是真滴慢,遇到MOD操作可以用if降低时间。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAX_N = 5e3+9;
     4 const int MOD = 1e9+7;
     5 char vec[MAX_N];
     6 int dp[MAX_N][MAX_N];
     7 void add(int pos,int x,int num)
     8 {
     9     if(num<0) num+=MOD;
    10     for(;x<MAX_N;x+=(x&-x))
    11     {
    12         dp[pos][x]=dp[pos][x]+num;
    13         if(dp[pos][x]>=MOD) dp[pos][x]-=MOD;
    14     }
    15 }
    16 int sum(int pos,int x)
    17 {
    18     int ans = 0;
    19     for(;x>0;x-=(x&-x))
    20     {
    21         ans=ans+dp[pos][x];
    22         if(ans>=MOD) ans-=MOD;
    23     }
    24     return ans;
    25 }
    26 int main()
    27 {
    28     int N,M,T;
    29     while(cin>>N)
    30     {
    31         memset(dp,0,sizeof(dp));
    32         for(int i=1;i<=N;i++)
    33         {
    34             cin>>vec[i];
    35         }
    36         dp[1][1] = 1;
    37         for(int i=1;i<=N;i++)
    38         {
    39             for(int j=1;j<=i;j++)
    40             {
    41                 int t = sum(i,j);
    42                 if(vec[i] == 'f')
    43                 {
    44                     add(i+1,j+1,t);
    45                     add(i+1,j+2,-t);
    46                 }
    47                 else
    48                 {
    49                     add(i+1,1,t);
    50                     add(i+1,j+1,-t);
    51                 }
    52             }
    53         }
    54         int ans = 0;
    55         for(int i=1;i<=N;i++)
    56         {
    57             ans = ans+sum(N,i);
    58             if(ans>=MOD) ans-=MOD;
    59         }
    60         cout<<(ans+MOD)%MOD<<endl;
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    2019.9.18 csp-s模拟测试46 反思总结
    2019.9.17 csp-s模拟测试45 反思总结
    矩阵求导(包含极大似然估计)
    sir
    Square into Squares. Protect trees!(平方数分解平方和)
    最小二乘法
    2.5&2.6 numpy&pandas 笔记
    2.4 python学习笔记
    2.3 python学习笔记
    2.1&2.2python学习笔记
  • 原文地址:https://www.cnblogs.com/doggod/p/8387274.html
Copyright © 2020-2023  润新知