Timus 1513 Lemon Tale
2013-12-29 17:01
316 查看
import java.io.*; import java.math.BigInteger; import java.util.*; public class Main { public static void main (String [] args) throws Exception { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int k = scan.nextInt(); BigInteger dp[][] = new BigInteger[n+1][3]; for(int i=0;i<=n;i++) Arrays.fill(dp[i], BigInteger.ZERO); dp[1][0] = BigInteger.ONE; dp[0][0] = BigInteger.ONE; if(k==0){ System.out.println(1); return; }else if(k==1){ dp[1][2] = BigInteger.ONE; }else{ dp[1][1] = BigInteger.ONE; } for(int i=2;i<=n;i++){ dp[i][0] = dp[i-1][0].add(dp[i-1][1]).add(dp[i-1][2]); if(i-k>=0) dp[i][2] = dp[i-k][0]; if(k!=1){ dp[i][1] = dp[i-1][0].add(dp[i-1][1]); if(i-k>=0) dp[i][1] = dp[i][1].subtract(dp[i-k][0]); } } System.out.println(dp [0].add(dp [1]).add(dp [2])); } }
把lemon和banana换成1和0来思考,就是说N长度的二进制数不能有连续K个1,求有多少个这样的数。
N范围给的太大所以复杂度只能是O(n).
dp[i][0]代表长度为i, 以0结尾的数量
dp[i][1]代表以1~k-1个1结尾的数量
dp[i][2]代表以K个1结尾的数量
然后递推即可。
没想到用long还是WA了,非逼我用bigInteger
相关文章推荐
- cocos2d-x显示3d模型
- Nutz 第一个Demo
- C++ 0x 使用 shared_ptr 自动释放, 防止内存泄漏
- wpf学习笔记-样式
- Guice 似乎没人维护了
- TRUNC函数的用法
- hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)
- wpf学习笔记-布局
- Linux + Nginx + Django + FastCGI
- 跟着《算法导论》学习——动态规划法(Dynamic programming)
- PhoneGap 启动慢 未显示App页面前 黑屏处理
- Android混合开发之Activity类与html页面之间的相互跳转(并解决黑屏问题)
- cocos2dx 常见的22种特效 3D特效
- 南邮-1950-比赛现场气氛营造问题
- wpf学习笔记-窗口
- 漏洞扫描工具NexPose安装使用
- 一个关于lambda的题目
- Shell编程基础
- php的魔术方法__get(),__set(),__call(),__callStatic()以及static延迟静态绑定
- 将 Hadoop YARN 发扬广大