HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】
题目链接: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【增长趋势——处理重复选数】的更多相关文章
- 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
题目链接: 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)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)
Problem Description The signature of a permutation is a string that is computed as follows: for each ...
- HDU 4055 Number String (计数DP)
题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的. 如果是‘D’,则反之. 析:dp[i][j] 表示前 i ...
- HDU 4055 Number String(DP计数)
题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...
- 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] + ...
随机推荐
- hdu 1398 Square Coins 分钱币问题
Square Coins Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- SQL索引及表的页的逻辑顺序与物理顺序
1.经过测试发现当聚集索引新建或者重建时,会按照逻辑顺序重新排列数据页和数据页内的数据行的物理顺序. 2.但修改表时,无论是聚集索引还是堆的数据页都是按自然顺序向后插入数据,页面上的偏移量可以证明.因 ...
- laravel学习之路4artisan
php artisan list php artisan help migrate Tinker 让你可以在命令行中与 Laravel 应用进行交互php artisan tinker 在routes ...
- ImportError: No module named '_sqlite3'
问题: Python 3.5.1 报错如下 Traceback (most recent call last): File "manage.py", line 16, in < ...
- PHP如何进阶,提升自己
2017年6月15日14:32:51 今天看今日头条,刷到了一个话题?是:整天增删改查调接口,PHP程序员,如何突破职业瓶颈晋级? 晋级包括:职位晋级:技术能力晋级.当你的技术能力晋级了,职位晋级也就 ...
- python+pip+adb
最近开始玩python,用它写一些小程序游戏的辅助,现在做下总结 下面进入正文. 本文适用对象为WIN10系统,安卓用户.目的在于让丝毫没有接触过Python的小伙伴都能成功运行,如果你恰好是这样的对 ...
- spring工作原理理解
spring的工作原理 spring是作为一个容器存在的框架,可以加载spring web,spring mvc,spring orm,sprong aop,spring dao等框架和模块,其主要核 ...
- Window系统下MongoDB安装及远程访问
1.编辑mongodb 安装文件夹bin\mongod.cfg 把bindIP 改为 127.0.0.1, 192.168.1.180(局域网IP) 可以参考https://blog.csdn.net ...
- 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...
- EasyNVR流媒体直播之:零基础实现摄像头的全平台直播 (二)公网直播的实现
接上回(https://blog.csdn.net/xiejiashu/article/details/81276870),我们实现内网直播,可以实现直播的web观看,该篇博文我们将实现公网的直播. ...