http://codeforces.com/problemset/problem/909/C

好像以前做过,但是当时没做出来,看了题解也不太懂。

一开始以为只有上面的for有了循环体,这里的statement就可以随便放,但其实并不是这样,statement的位置会取消比它缩进更多或相等的for的可append性。所以设计dp顺序的时候要用dp[i][j]表示第i行剩余可选for循环数量为j的选法数。那么递推公式也不难(才怪),看看代码就好了。

有几个可以优化的,一个是滚动数组,另一个是线性求前缀和然后均摊O(1)减少一个维度的时间复杂度。

注意读入%c之前要加一个空格来过滤前面还保留在流中的换行符

#include<bits/stdc++.h>
using namespace std;
#define ll long long ll dp[][];
char ch[];
int n;
int p=; int main(){
scanf("%d",&n); for(int i=;i<n;i++){
scanf(" %c",&ch[i]);
//printf("%c\n",ch[i]);
} int cntf=;
if(ch[]=='f')
cntf++;
dp[][cntf]=;
//可跟随的f的数量
/*for(int j=0;j<=cntf;j++){
printf("dp[%d][%d]=%lld\n",0,j,dp[0][j]);
}
printf("\n");*/ for(int i=;i<n;i++){
if(ch[i]=='f'){
cntf++;
if(i->=&&ch[i-]=='f'){
//dp[i]=dp[i-1];
//不得不跟随
for(int j=;j<=cntf;j++){
dp[i][j]=dp[i-][j-];
}
}
else if(i->=&&ch[i-]=='s'){
//任选一个f进行跟随
ll sum=;
for(int j=;j<=cntf-;j++){
sum=(sum+dp[i-][j])%p;
} ll presum=;
for(int j=;j<=cntf;j++){
dp[i][j]=(sum-presum+p)%p;
presum=(presum+dp[i-][j-])%p;
}
}
}
else{
if(i->=&&ch[i-]=='f'){
//dp[i]=dp[i-1];
//不得不跟随
for(int j=;j<=cntf;j++){
dp[i][j]=dp[i-][j];
}
}
else if(i->=&&ch[i-]=='s'){
//任选一个f进行跟随
ll sum=;
for(int j=;j<=cntf;j++){
sum=(sum+dp[i-][j])%p;
} ll presum=;
for(int j=;j<=cntf;j++){
dp[i][j]=(sum-presum+p)%p;
presum=(presum+dp[i-][j])%p;
}
}
}
/*for(int j=0;j<=cntf;j++){
printf("dp[%d][%d]=%lld\n",i,j,dp[i][j]);
}
printf("\n");*/
} ll sum=;
for(int j=;j<=cntf;j++){
sum=(sum+dp[n-][j])%p;
}
printf("%lld\n",sum); }

---恢复内容结束---

Codeforces - 909C - Python Indentation - 简单dp的更多相关文章

  1. Codeforces 909C - Python Indentation

    909C - Python Indentation 思路:dp. http://www.cnblogs.com/Leohh/p/8135525.html 可以参考一下这个博客,我的dp是反过来的,这样 ...

  2. Codeforces 909C Python Indentation:树状数组优化dp

    题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...

  3. Codeforces 1108D - Diverse Garland - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/1108/D time limit per test 1 secondmemory limit per te ...

  4. Codeforces - 702A - Maximum Increase - 简单dp

    DP的学习计划,刷 https://codeforces.com/problemset?order=BY_RATING_ASC&tags=dp 遇到了这道题 https://codeforce ...

  5. Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学

    https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...

  6. Codeforces - 474D - Flowers - 构造 - 简单dp

    https://codeforces.com/problemset/problem/474/D 这道题挺好的,思路是这样. 我们要找一个01串,其中0的段要被划分为若干个连续k的0. 我们设想一个长度 ...

  7. CodeForces 30C Shooting Gallery 简单dp

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/36944227 题目链接:点击打开链接 给定 ...

  8. Codeforces - 1033C - Permutation Game - 简单dp - 简单数论

    https://codeforces.com/problemset/problem/1033/C 一开始觉得自己的答案会TLE,但是吸取徐州赛区的经验去莽了一发. 其实因为下面这个公式是 $O(nlo ...

  9. CodeForces 22B Bargaining Table 简单DP

    题目很好理解,问你的是在所给的图中周长最长的矩形是多长嗯用坐标(x1, y1, x2, y2)表示一个矩形,暴力图中所有矩形易得递推式:(x1, y1, x2, y2)为矩形的充要条件为: (x1, ...

随机推荐

  1. php-cpp用来开发php的拓展

    官网: http://www.php-cpp.com/documentation/install, 找时间要学一下.

  2. memcached优化方法

    工作原理     基本概念:slab,page.chunk.     slab,是一个逻辑概念. 它是在启动memcached实例的时候预处理好的,每一个slab相应一个chunk size.也就是说 ...

  3. HDU 4902 Nice boat 线段树+离线

    据说暴力也过了.还傻逼地写了这么长. . . #include <stdio.h> #include <string.h> #include <math.h> #i ...

  4. Android Problem- android.content.res.Resources$NotFoundException: String resource ID #0xa

    在使用listview时出现错误android.content.res.Resources$NotFoundException: String resource ID #0xa 经查证是在调用Text ...

  5. C#总结复习5(需要进一步复习)

    第十五章 接口 1.接口: C++中允许多继承没有接口的概念.而java与C#中有,因为C#中 是单继承多接口. 所谓的接口,其实和抽象类.方法相似.都只有一个空方法.其本身不可以为基类,但是允许被其 ...

  6. 使用BatteryHistorian分析和优化应用电量

    欢迎Follow我的GitHub, 关注我的CSDN. 在Android项目中, 较难监控应用的电量消耗, 可是用户却很关心手机的待机时间. 过度耗电的应用, 会遭到用户无情的卸载, 不要存在侥幸心理 ...

  7. 查询mysql字段名和字段注释

    select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='表名' and table_sc ...

  8. 阿里云serverMySQL无法连接问题解决纪实

    作者:fbysss QQ:溜酒酒吧酒吧吾散 blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 背景: 在调试程序的时候,发现数据库訪问相关的环节出现错误 ...

  9. Java堆内存与栈内存对比

    在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有什么异同,以及和数据结构中的堆栈有何关系? 一.Java 堆存储空间 堆内存(堆存储空间)会在Java运行时分配 ...

  10. 三张图教你生成一个Android jar 库。

    我看到非常多教人使用第三方开源组件的Android教程.都是在教基于源代码project的库导入,个人觉得非常不妥,觉得最恰当的方式是把源代码project生成一个jar再导入到目标project上使 ...