摘要: 题意就是找0到n有多少个数中含有49。数据范围接近10^20 DP的状态是2维的dp[len][3] dp[len][0] 代表长度为len不含49的方案数 dp[len][1] 代表长度为len不含49但是以9开头的数字的方案数 dp[len][2] 代表长度为len含有49的方案数 状态转移如下 dp[i][0] = dp[i-1][0] * 10 - dp[i-1][1]; // not include 49 如果不含49且,在前面可以填上0-9 但是要减去dp[i-1][1] 因为4会和9构成49 dp[i][1] = dp[i-1][0]; // not include 49 but starts with 9 这个直接在不含49的数上填个9就行了 dp[i][2] = dp[i-1][2] * 10 + dp[i-1][1]; // include 49 已经含有49的数可以填0-9,或者9开头的填4 接着就是从高位开始统计 在统计到某一位的时候,加上 dp[i-1][2] * digit[i] 是显然对的,因为这一位可以填 0 阅读全文
posted @ 2016-05-29 21:00 十目 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 就是dp,从后面开始dp,题意是不能有连续的相同的字符串,开始读错题了,从右往左推,设valid[i]表示存不存在一种方案,使得能将s[i](包括)以后的字符全部拿掉,这个就可以递推了,每往左推一格,看valid[i+2]和valid[i+3],如果为真,再往后搜一下相应的字符串,看有没有连续出现。要注意的是,就算连续出现了,如果存在一种方案使得长度不一样的话,也是合法的,例如pptpptt,搜ppt的时候,是连续出现的,但可以这么分:ppt|pp|tt,所以需要额外判断下valid[i+5]。一旦合法,就把valid[i]置为1,以此类推。但有一个问题,为什么val[5]为真就一定可以,有可能紧跟的字符串不一定就可以按照其理想的长度啊?没想明白 阅读全文
posted @ 2016-05-29 20:57 十目 阅读(206) 评论(0) 推荐(0) 编辑