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

题意:

  给你一个由'I', 'D', '?'组成的字符串,长度为n,代表了一个1~n+1的排列中(数字不重复),相邻数字的增长趋势。('I'为增,'D'为减,'?'为未知)

  问你符合条件的数列有多少种。

题解:

  表示状态:

    dp[i][j] = combinations

    表示长度为i的排列(由1~i组成),末尾为j,这样的排列的个数

  找出答案:

    ans = ∑ dp[n][1 to n]

  如何转移:

    先考虑增长('I')。

    对于dp[i][j],是由dp[i-1][k with k < j]在末尾添加一个j得到的。

    也就是:

      dp[i][j] = ∑ dp[i-1][1 to j-1]

    可是在dp[i-1][k with k < j]的数列中,由可能j已经选过。

    为了处理这种情况,可以想成将原来数列中 >= j的数都+1。

    这样并不影响原数列的增长性,也不影响答案。

    对于'D'和'?'同理:

      D: dp[i][j] = ∑ dp[i-1][j to i-1]

      ?: dp[i][j] = ∑ dp[i-1][1 to i-1]

AC Code:

 // state expression:
// dp[i][j] = combinations
// i: considering ith num
// j: last num
//
// find the answer:
// sigma dp[n][1 to n]
//
// transferring:
// if increase
// dp[i][j] = sigma dp[i-1][1 to j-1]
// if decrease
// dp[i][j] = sigma dp[i-1][j+1 to i-1]
//
// boundary:
// dp[1][1] = 1
// others = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1005
#define MOD 1000000007 using namespace std; int n;
int ans;
int dp[MAX_N][MAX_N];
int sum[MAX_N][MAX_N];
string s; int cal_mod(int a)
{
return (a%MOD+MOD)%MOD;
} int cal_sum(int i,int x,int y)
{
if(x>y) return ;
if(x==) return sum[i][y];
return cal_mod(sum[i][y]-sum[i][x-]);
} void update_sum(int i,int j,int a)
{
if(j==) sum[i][j]=cal_mod(a);
else sum[i][j]=cal_mod(sum[i][j-]+a);
} void solve()
{
n=s.size()+;
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
dp[][]=;
for(int i=;i<=n;i++) sum[][i]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=i;j++)
{
if(s[i-]=='I') dp[i][j]=cal_sum(i-,,j-);
else if(s[i-]=='D') dp[i][j]=cal_sum(i-,j,i-);
else dp[i][j]=cal_sum(i-,,i-);
update_sum(i,j,dp[i][j]);
}
}
ans=cal_sum(n,,n);
} void print()
{
cout<<ans<<endl;
} int main()
{
while(cin>>s)
{
solve();
print();
}
}

HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】的更多相关文章

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

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

  2. HDU 4055 Number String dp

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

  3. hdu 4055 Number String (基础dp)

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

  4. hdu 4055 Number String

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

  5. hdu 4055 Number String(dp)

    Problem Description The signature of a permutation is a string that is computed as follows: for each ...

  6. HDU 4055 Number String (计数DP)

    题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的. 如果是‘D’,则反之. 析:dp[i][j] 表示前 i ...

  7. HDU 4055 Number String(DP计数)

    题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...

  8. hdu 4055 Number String(递推DP)

    给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ...

  9. 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] + ...

随机推荐

  1. 使用GnuPG(PGP)加密信息及数字签名教程_转

    所谓加解密就是一方以密钥加密,另一外收到文件后以相对应的密钥解密,从而获取原始文件.数字签名的过程:信息是通过普通未加密方式发送信息给对方的,只是在每条信息后面都会附加一坨字符(名曰:签名)(或信息与 ...

  2. memcached在Java中的应用以及magent的配置-每天进步一点点

    memcached在Java中的应用: http://nhy520.iteye.com/blog/1775893 magent配置memcached分布式集群的应用: http://www.jians ...

  3. linux卸载一个源码包安装的软件的流程

    完全卸载memcached的方法(CentOS) 我的大内存vps(centos系统)曾经安装过memcached,想给论坛提速,实际上不但没有明显效果,反倒耗费内存,看着碍眼,于是想卸载,于是网上各 ...

  4. Myeclipse 选中高亮

    打开显示功能 选择Windows->Preferences->Java-> Editor-> Mark Occurrences ,勾选选项.这时,当你单击一个元素的时候,代码中 ...

  5. 爬虫入门【3】BeautifulSoup4用法简介

    快速开始使用BeautifulSoup 首先创建一个我们需要解析的html文档,这里采用官方文档里面的内容: html_doc = """ <html>< ...

  6. docker安装并配置加速

    安装 旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本: sudo apt-get remove docker \ docker-engine \ ...

  7. 第二课 创建http server

    nodejs 不需要单独安装服务器软件 tomcat .apache. iis 看下面的代码创建了http服务器,并输出一些简单的响应内容 //引入http 模块 var http = require ...

  8. elasticsearch从入门到出门-03-多种搜索

    1.query string search 2.query DSL 3.query filter 4.full-text search 5.phrase search 6.highlight sear ...

  9. 13.Django模版

    没什么好说的,看官方文档 https://docs.djangoproject.com/en/1.9/ref/templates/builtins/

  10. 寻找第K大 网易2016实习研发工程师编程题

    有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2] ...