题目链接: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. linux recv函数返回值分析

    函数原型: ssize_t recv(int sockfd, void *buf, size_t len, int flags); 该函数第一个参数制定接收端套接字描述符; 第二个参数指明一个缓冲区, ...

  2. Swift开发图解入门

    <论语·卫灵公>有一段经典对白:『子贡问为仁.子曰:工欲善其事,必先利其器. --』. 对于一个程序猿来说,好的工具不意味着一定能产生优质的代码.可是好的工具对提升开发效率的作用还是不言而 ...

  3. 程序员之---C语言细节19(来找茬,由/* */ 引起的凝视错误)

    主要内容:由/* */ 引起的凝视错误 有4处凝视错误 #include <stdio.h> #define N 10 //使用以下宏定义的凝视 #define BSC // #defin ...

  4. saltstack内置state模块file之append

    添加文件文本在文件尾部 salt.states.file.append(name, text=None, makedirs=False, source=None, source_hash=None, ...

  5. 创建有提示的ui组件

    using UnityEditor; using UnityEngine; using System.Collections; using Edelweiss.CloudSystem; namespa ...

  6. MongoDBTemplate多条件查询的问题

    问题: 在使用Spring Data MongoDB 进行条件查询数据时,发现条件判断不起作用,结果会返回所有的数据. Criteria criteria = new Criteria(); crit ...

  7. 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组

    [BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...

  8. 《Java线程池》:任务拒绝策略

    在没有分析线程池原理之前先来分析下为什么有任务拒绝的情况发生. 这里先假设一个前提:线程池有一个任务队列,用于缓存所有待处理的任务,正在处理的任务将从任务队列中移除.因此在任务队列长度有限的情况下就会 ...

  9. OLTP和OLAP

    1 OLTP和OLAP online transaction processing,联机事务处理.业务类系统主要供基层人员使用,进行一线业务操作,通常被称为联机事务处理. online analyti ...

  10. 【python】-- try except (异常捕获)、断言

    try except (异常捕获) 当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的错误,出现这样的错误代表着什么,我们可以提前捕获这些个错误 1.异常 ...