zoj 3543 - Number String(动规)

2023-11-20 19:08
文章标签 string number zoj 动规 3543

本文主要是介绍zoj 3543 - Number String(动规),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘:http://blog.csdn.net/morgan_xww/article/details/6847305

为什么能够能从子问题转移?

  在做dp[i][j]转移我们可以在前一状态中将超过j的值的数+1,就像从1,4,3,2 加3的时候 变成1,5,4,2,3(增减性不变)

状态:dp[i][j] 表示长度为i以j结尾的合法的排列个数(由1...i组成的排列)。

状态转移:if(s[i]=='I') dp[i][j] = dp[i-1][1] + dp[i-1][2] + ... + dp[i-1][j-1];
        if(s[i]=='D') dp[i][j] = dp[i-1][j+1] +...+ dp[i-1][i-1]+dp[i-1][i](这里等于dp[i][j],原理见附加结论);
        if(s[i]=='?') dp[i][j] = dp[i-1][1] + dp[i-1][2] + ... + dp[i-1][i-1];
还要清楚一个结论:
给定一个长度为i-1的字符串,由{1,2,...,i}组成的合法排列数和由{1,2,...,j-1,j+1,...,i+1}
组成的合法排列数是相同的。


时间复杂度是O(n^3)的,但定义一个sum[i][j]利用部分求和,就转化成了O(n^2).

代码如下:

int main()
{while(~scanf("%s", s)){int len = strlen(s)+1;dp[1][1] = sum[1][1] = 1;for(int i = 2; i <= len; ++i)for(int j = 1; j <= i; ++j){if(s[i-2]=='D') dp[i][j] = (sum[i-1][i-1]-sum[i-1][j-1]+mod)%mod;else if(s[i-2]=='I') dp[i][j] = sum[i-1][j-1];else if(s[i-2]=='?') dp[i][j] = sum[i-1][i-1];sum[i][j] = (sum[i][j-1]+dp[i][j])%mod;}printf("%lld\n", sum[len][len]);}return 0;
}


这篇关于zoj 3543 - Number String(动规)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396788

相关文章

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;