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的题目刚开始想出来的算法,要么会超时,要么会爆空间,需要优化。

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

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

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

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

最新文章

  1. MVC Code First 当实体类发生变化时,如何自动更新数据库表
  2. C#版 Winform界面 Socket编程 Server服务器端
  3. android ListView详解继承ListActivity
  4. MariaDB 加密特性及使用方法
  5. POJ 3484
  6. ionic cordova plugin for ios
  7. 一天学完UFLDL
  8. iOS开发——常用宏的定义
  9. 关于String的对象创建
  10. [转]Linux里的2&gt;&amp;1究竟是什么
  11. 用java开发dota英雄最华丽的技能
  12. 【PAT】B1065 单身狗(25 分)
  13. vuex 的基本使用之Module
  14. mybatis拦截器案例之获取结果集总条数
  15. Todo&amp;Rocket
  16. TCP UDP Socket 即时通讯 API 示例 MD
  17. 利用springMVC包装类上传多个文件
  18. IOS UITableView的代理方法详解
  19. 几个shell程序设计小知识(shell常识部分)
  20. 【刷题】BZOJ 3172 [Tjoi2013]单词

热门文章

  1. 爬虫关于ip管理池的应用
  2. context.response.end()和return的区别
  3. 算法笔记_014:合并排序(Java)
  4. Vmware(vmdk)虚拟机到hyperv(vhd)虚拟机转换
  5. MIT线性代数课程 总结与理解-第一部分
  6. TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts
  7. 进度管理工具 planner
  8. ueditor的工具按钮配置
  9. QList 排序
  10. 学习smail注入遇到的坑