想进大厂太难了,上来就动态规划,真毫无思路QAQ
没办法啊,还是得慢慢学
1、 生成数列的个数
想了1个小时,想到用动态规划,然后就没有思路了。。。
看了一些大佬们的想法做了一下,有错误请批评指证
public class Main {
public static void main(String args[]) throws IOException, InterruptedException {
Scanner cin=new Scanner(System.in);
/*
* 思路 动态规划
* 设dp[i][0]代表在选了i个数的情况下余3为0的数量,1,2同理
* 则dp[i+1][0]就是对上一组对数进行查找
* 即选了i+1个数余三为0的情况数选了i个数为0的情况下*区间内为0的数量+
* 选了i个数为1的情况下*区间内为2的数量(1+2%3=0)+
* 选了i个数为2的情况下*区间内为1的数量
* 其余两个以此类推
* 在mod上1e9机位答案
* */
int n=cin.nextInt(),l= cin.nextInt(),r= cin.nextInt();
int x0=0,x1=0,x2=0;
int [][]dp=new int[n][3];
//遍历区间,分别统计余3为0,1,2的数的个数
for(int i=l;i<=r;i++){
if(i%3==0)x0++;
else if(i%3==1)x1++;
else x2++;
}
//动态规划
dp[0][0]=x0;dp[0][1]=x1;dp[0][2]=x2;
for(int i=1;i<n;i++){
dp[i][0]=dp[i-1][0]*x0+dp[i-1][1]*x2+dp[i-1][2]*x1;
dp[i][1]=dp[i-1][0]*x1+dp[i-1][1]*x0+dp[i-1][2]*x2;
dp[i][2]=dp[i-1][0]*x2+dp[i-1][1]*x1+dp[i-1][2]*x0;
}
System.out.println(dp[n-1][0]);
}
}
2、统计不能被k整除的子集个数
没有思路
3、 启动机器
完全读不懂题。。。
4、 线段和树
感觉是唯一能做的。。。
两边遍历建图然后bfs判断即可