HDU 4055:Number String(DP计数)
http://acm.hdu.edu.cn/showproblem.php?pid=4055
题意:给一个仅包含‘I','D','?'的字符串,’I'表示前面的数字比后面的数字要小(Increase升序),'D'表示前面的数字比前面的数字要大(Decrease降序),'?'表示有可能是'I'也有可能是'D',长度为n的字符串就有n+1个数字,在这n+1个数字里面,问符合给出的字符串的条件的序列数有多少种。
思路:dp[i][j]的定义:i表示当前枚举到第i个字符(即长度为i+1的时候的序列),j表示当前序列长度为i+1的时候第i+1位插入的数是什么,dp[i][j]表示长度为i+1的序列末尾为j的序列数总共有多少种。
首先需要转化一个思维:即例如前面序列长度为3,假设s[4] = 'D', 那么加入当前的数的时候,即(3, 1, 2),现在枚举的是dp[4][1],即要插入1,那么可以当成前面大于等于1(j)的数全部+1,序列就变成(4, 2, 3, 1),因此可以用前面的来推出后面的。
当s[i]为'I'的时候,插入的数要比前面一位大,因此前面一位是(1~j-1)的时候都可以插入,所以dp[i][j] = dp[i-1][j-1] + ... + dp[i-1][1].
当s[i]为'D'的时候,插入的数要比前面一位小,前面说了,要插入的数j在前面重复的时候,可以把前面的大于等于j的数都+1,所以前面是(j~i)都可以插入(j也是可取的,因为+1就变成j+1了),dp[i][j] = dp[i-1][j] + ... + dp[i-1][i].
这个式子是可以处理出前缀和的,即每次都把dp[i][j] = dp[i][j-1]这样就可以累加起来了。
而且当前的i只和i-1有关,可以使用滚动数组,还有交C++如果MOD运算过多会超时。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define N 1010
const int MOD = 1e9 + ;
LL dp[][N];
char s[N];
int main() {
while(~scanf("%s", s + )) {
int n = strlen(s + );
memset(dp, , sizeof(dp));
int pre = , now = ;
dp[pre][] = ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= i + ; j++) {
dp[now][j] = dp[now][j-]; // 前缀和
if(s[i] != 'I') dp[now][j] = (dp[now][j] + (dp[pre][i] - dp[pre][j-]) + MOD) % MOD;
if(s[i] != 'D') dp[now][j] = (dp[now][j] + dp[pre][j-]) % MOD;
}
pre ^= now; now ^= pre; pre ^= now;
}
printf("%lld\n", dp[n%][n+]);
}
return ;
}
HDU 4055:Number String(DP计数)的更多相关文章
- HDU 4055 Number String(DP计数)
题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...
- HDU 4055 Number String dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...
- hdu 4055 Number String(有点思维的DP)
Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4055 Number String (基础dp)
Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 4055 Number String
Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...
- HDU 4055 Number String (计数DP)
题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的. 如果是‘D’,则反之. 析:dp[i][j] 表示前 i ...
- HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意: 给你一个由'I', 'D', '?'组成的字符串,长度为n,代表了一个1~n+1的排列中 ...
- hdu 4055 Number String(dp)
Problem Description The signature of a permutation is a string that is computed as follows: for each ...
- hdu 4055 Number String(递推DP)
给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ...
- 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] + ...
随机推荐
- 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题
原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...
- DataGrid自定义复选框
<DataGridTemplateColumn Header="选择" Width="Auto" > <!--列头模板--> <D ...
- 使用StringBuilder与SqlParameter
好处: 防止sql注入:占用内存更少 例子: 传参有业务查询条件startDate,endDate,A,每页数据个数pageSize,当前查询页码pageIndex string sql = @&qu ...
- AngularJS table循环数据
<div ng-app="CycleTableApp" ng-controller="CycleTableContrl as vm"> <h1 ...
- Bootstrap路径导航
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- Win8Metro(C#)数字图像处理--2.34直方图规定化
原文:Win8Metro(C#)数字图像处理--2.34直方图规定化 [函数名称] WriteableBitmap HistogramSpecificateProcess(WriteableBi ...
- SpringMvc 资料
web.xml解释 http://www.cnblogs.com/superjt/p/3309255.html url-pattern解释 http://www.cnblogs.com/zhangpe ...
- ArrayList(1.8)
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...
- 网络文件系统nfs文件系统使用(很全面)
一.NFS简介 1.NFS就是Network FileSystem的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(sharefiles)——可以通过NFS挂载远程主机的目 ...
- 查看SharePoint文档库是,显示层次目录,可以点击返回层次
在sharepoint 2013中,Documnet library(文档库)包含多层文件夹,当进入到文件夹后,返回指定层次了(例如返回上一层),需要用浏览器的返回. 使用起来不方便,而且浏览器的返回 ...