cf909c C. Python Indentation dp滚动

本文介绍了一种使用动态规划解决复杂算法问题的方法,通过一个具体的示例,展示了如何初始化状态数组,更新状态以及最终获取结果的过程。文章深入探讨了算法的细节,包括状态转移方程的推导和优化技巧,旨在帮助读者理解和掌握动态规划的核心思想。

考虑当前层数

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>

int n;
long long mod=1e9+7;

long long dp[2][5005];
long long sum[2][5005];

char ch[5005];
int cur;
int main() {

    while(~scanf("%d",&n))
    {
        //getchar();
        ch[0]=' ';
        for(int i=1;i<=n;i++)
        {
            getchar();
            scanf("%c",&ch[i]);
        }
        memset(dp,0,sizeof(dp));
        memset(sum,0,sizeof(sum));

        dp[0][1]=1;
        for(int i=1;i<=5002;i++)
        {
            sum[0][i]=(sum[0][i-1]+dp[0][i])%mod;
        }

        cur=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                //if (ch[i] == 's')
                {
                    if(ch[i-1]=='f')
                    {
                        dp[cur][j]=dp[cur^1][j-1]%mod;
                    }
                    else
                    {
                        dp[cur][j]=(sum[cur^1][n]-sum[cur^1][j-1])%mod;
                    }
                }
                sum[cur][j]=(sum[cur][j-1]+dp[cur][j])%mod;
            }
            cur^=1;
        }

        printf("%lld\n",(sum[cur^1][n]+mod)%mod);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值