题目链接: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. 【转】Lua 操作系统库

      转老帖子备份 转自:http://www.cnblogs.com/whiteyun/archive/2009/08/10/1542913.html os.clock () 功能:返回一个程序使用C ...

  2. CAP原则 和BASE

    CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼 [1]  ...

  3. iOS swift NSClassFromString将字符串转换成类名

    在oc中将字符串转换成类名直接调用NSClassFromString("classname")即可,但是到了swift中变的麻烦多了 swift中如果要将字符串转换为类型需要以下几 ...

  4. linux下性能测试工具netperf使用

    一.功能简介 netperf是一款针对网络性能的测试工具,主要基于TCP或UDP的传输.根据应用的不同,可以进行批量数据传输(bulk data transfer)模式和请求/应答(request/r ...

  5. 精准 iOS 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  6. PowerBuilder--Aes128加解密

    通过C#开发Com控件,注册到系统,然后由pb通过OLEObject进行调用 原文:https://www.cnblogs.com/eric_ibm/archive/2012/07/06/dll.ht ...

  7. Android中的常见通信机制和Linux中的通信机制

    Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线 ...

  8. 在Linux中显示日历(cal)

    cal 2013    显示2013年整年日历 cal 7 2013  显示2013年 7 月 日历

  9. TP框架---thinkphp表单验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证.验证的代码要写在模型层即Model里面. 数据验证有两种方式: 静态方式:在模型类里面 ...

  10. 九度OJ 1204:农夫、羊、菜和狼的故事 (遍历、BFS)

    时间限制:1 秒 内存限制:32 兆 特殊判题:是 提交:744 解决:502 题目描述: 有一个农夫带一只羊.一筐菜和一只狼过河. 果没有农夫看管,则狼要吃羊,羊要吃菜. 但是船很小,只够农夫带一样 ...