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. php钩子程序设计

      序   作为程序员,设计出优雅而完美的系统,永远是让我们非常兴奋的事情.高手不在于你会多少语言,而在于你有多高的思想.   在设计中,怎么体现自身价值,那就是要比别人多想几步.   讲钩子程序,起 ...

  2. web页面在微信里打开,字体颜色不正常显示

    问题:写的web项目在微信里的webview里打开(iphone手机),会出现颜色的不识别.写的是白色,数字的部分会过了3-5秒后,变成黑色! 原因:在iphone手机里,数字的部分(具体的长度没有测 ...

  3. [CSS] 子元素垂直居中的两种方式

    1. 多个子元素水平并排,IE10以下失效 display: flex; align-items: center; justify-content: center; 2.多个子元素竖直排列,这种方式会 ...

  4. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...

  5. 第17章 使用PHP和MySQL实现身份验证

    1.对密码进行加密:sha1(string str,bool raw_output) //将返回一个40个字符的伪随机字符串,若raw_output为true,着得到一个20个字符的二进制字符串数据 ...

  6. jq屏蔽f5

    //屏蔽F5 $(document).ready(function () { $(document).bind("keydown", function (e) { e = wind ...

  7. W: http://archive.ubuntukylin.com:10006/ubuntukylin/dists/xenial/InRelease: Signature by key 6CE35A4EBAB676094476BE7CD259B7555E1D3C58 uses weak digest algorithm (SHA1)

    新装ubuntukylin 16.04,sudo apt-get update 时遇到如下问题:   Hit:1 http://archive.ubuntukylin.com:10006/ubuntu ...

  8. Shell终端收听音乐--网易云音乐命令行版

    Musicbox:网易云音乐命令行版本 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写. 这款命令行的客户端使用 Python 构建,以 mpg123 作为播放后端: Vim 式 ...

  9. NYOJ-括号配对问题 <技巧性的非栈道法>

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3  描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100) ...

  10. 【 Note 】GDB调试

    GDB是在linux下的调试功能 命令: 启动文件: 普通调试 gdb 可执行文件 分屏调试 gdb -tui 可执行文件 ->调试: 运行 r 设置断点 b 删除断点 delete 断点编号 ...