您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: