Number String

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055

dp

定义状态:dp[i][j]为当strlen=i,数字结尾为j的方案数.

当为'I'时,dp[i][j]=∑dp[i-1][1...j-1];//若之前填过j,可以让前面j到i的数+1

当为'D'时,dp[i][j]=∑dp[i-1][j...i];

当为'?'时,dp[i][j]=∑dp[i-1][1...i].

于是我们有了O(n3)的算法:

 #include<cstdio>
#include<cstring>
#define N 1005
#define M 1000000007
using namespace std;
typedef long long LL;
char a[N];
LL dp[N][N],len;
int main(void){
while(~scanf("%s",a+)){
memset(dp,,sizeof(dp));
len=strlen(a+);
for(LL i=;i<=len;++i)
dp[][i]=;
for(LL i=;i<=len;++i){
if(a[i]=='I'){
for(LL j=;j<=i;++j)
if(dp[i-][j]){
for(LL k=j+;k<=i+;++k)
dp[i][k]=(dp[i][k]+dp[i-][j])%M;
}
}else if(a[i]=='D'){
for(LL j=;j<=i;++j)
if(dp[i-][j]){
for(LL k=;k<=j;++k)
dp[i][k]=(dp[i][k]+dp[i-][j])%M;
}
}else if(a[i]=='?'){
for(LL j=;j<=i;++j)
if(dp[i-][j]){
for(LL k=;k<=i+;++k)
dp[i][k]=(dp[i][k]+dp[i-][j])%M;
}
}
}
LL ans=;
for(LL i=;i<=len+;++i)
ans=(ans+dp[len][i])%M;
printf("%I64d\n",ans);
}
}

但是这个复杂度是不能ac的,需要优化。

注意到状态转移的时候,出现了类似前缀和的性质,于是可以维护一个pre[N]数组,使复杂度达到O(n2

代码如下:

 #include<cstdio>
#include<cstring>
#define N 1005
#define M 1000000007
using namespace std;
typedef long long LL;
char a[N];
LL dp[N][N],len,pre[N];
int main(void){
while(~scanf("%s",a+)){
memset(dp,,sizeof(dp));
memset(pre,,sizeof(pre));
len=strlen(a+);
for(LL i=;i<=len;++i){
dp[][i]=;
pre[i]=pre[i-]+dp[][i];
}
for(LL i=;i<=len;++i){
if(a[i]=='I'){
for(LL j=;j<=i+;++j)
dp[i][j]=pre[j-];
}else if(a[i]=='D'){
for(LL j=;j<=i+;++j)
dp[i][j]=(pre[i]-pre[j-]+M)%M;
}else if(a[i]=='?'){
for(LL j=;j<=i+;++j)
dp[i][j]=pre[i];
}
for(LL j=;j<=i+;++j)
pre[j]=(pre[j-]+dp[i][j])%M;
}
printf("%I64d\n",pre[len+]);
}
}

感觉dp的题目刚开始想出来的算法,要么会超时,要么会爆空间,需要优化。

然而我的优化方案是写完高复杂度代码后,按照转移方程的形式进行优化。

这样做的坏处是,优化完了方程面目全非,自己也不知道方程的意义...

可能是太弱了吧,继续加油~

//这两个星期金工实习,不用去上好爽~

Number String的更多相关文章

  1. perl malformed JSON string, neither tag, array, object, number, string or atom, at character offset

    [root@wx03 ~]# cat a17.pl use JSON qw/encode_json decode_json/ ; use Encode; my $data = [ { 'name' = ...

  2. hdu 4055 Number String(有点思维的DP)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. hdu4055 Number String

    Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. js Number string

    Number string number Js只有一种数字类型(包括整型,浮点型) 极大或极小的可用科学计数法来表示.(7.7123e+1) 所有js数字均为64位 Js所有的数字都存储为浮点型 小数 ...

  5. HDU 4054 Number String

    HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...

  6. HDU-4055:Number String

    链接:HDU-4055:Number String 题意:给你一个字符串s,s[i] = 'D'表示排列中a[i] > a[i+1],s[i] = 'I'表示排列中a[i] < a[i+1 ...

  7. HDU 4055 Number String dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...

  8. hdu 4055 Number String

    Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...

  9. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. 在VirtualBox上安装CentOS7

    文章的出处:http://jingyan.baidu.com/article/9c69d48f8ec01613c8024e58.html 工具: VirtualBox-5.1.2-108956-Win ...

  2. IntelliJ IDEA 设置代码提示或自动补全的快捷键 (附IntelliJ IDEA常用快捷键)

    修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航框中点击 KeyMap. 接着在右边的树型框 ...

  3. 深入理解Hadoop集群和网络

    导读:云计算和Hadoop中网络是讨论得相对比较少的领域.本文原文由Dell企业技术专家Brad Hedlund撰写,他曾在思科工作多年,专长是数据中心.云网络等.文章素材基于作者自己的研究.实验和C ...

  4. 如何运用xp_cmdshell 执行多行cmd命令

    因为需要利用sql  脚本调用外部程序,所以尝试xp_cmdshell 命令,发现其默认只能执行一行命令,最后找到了下面方法: 将多行cmd 命令处理成bat文件,然后直接利用所在路径+文件来执行: ...

  5. 最简单的jdbc操作

    Connection con = null; Statement stmt = null; // 保存到表中 String sql = "insert into website(userna ...

  6. iOS 发布项目到CocoaPods其实没那么复杂😆

    首先大家必须要了解一下CocoaPods (如果你连CocoaPods是啥都不知道可以不用往下看了

  7. ORALCE 编译过程卡死解决方法。

    --摘自网易博客 术士 在对存储过程进行test的时候,没有完全停止,就又在另外一个窗口,对它进行修改而且进行编译,出现了卡死现象. 用PLSQL Developer 在session里,找到这条se ...

  8. hdu5976贪心乘法逆元

    hdu 5976 Detachment题目连接 题意: 给定一个自然数x,让你给出一种拆分方式n=a1+a2+...(ai≠aj),使得每个小部分的乘积s=a1*a2*...最大 解题思路: 我们要乘 ...

  9. iOS SDWebImage的使用

    现在把代码贴出来,供大家参考.尤其是新手,看完这篇博客,图片缓存so easy.最后有demo供大家下载,先学习. 第一步,下载SDWebImage,导入工程.github托管地址https://gi ...

  10. DP! | 不要怂!

    跟一个博客刷: http://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 1.递推 HDU 2084 #include <b ...