BZOJ 4300: 绝世好题
Posted You Siki
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 4300: 绝世好题相关的知识,希望对你有一定的参考价值。
Problem 4300. -- 绝世好题
4300: 绝世好题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1597 Solved: 814
[Submit][Status][Discuss]
Description
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
Input
输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。
Output
输出文件共一行。
包括一个整数,表示子序列bi的最长长度。
Sample Input
3
1 2 3
1 2 3
Sample Output
2
HINT
n<=100000,ai<=2*10^9
Source
贪心,用$f[i]$表示结尾数字第i位上为1的最长子序列长度。
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String args[]) { 7 8 Scanner in = new Scanner(System.in); 9 10 int n = in.nextInt(); 11 int f[] = new int[35]; 12 13 Arrays.fill(f, 0); 14 15 for (int i = 1; i <= n; ++i) { 16 17 int num = in.nextInt(), tmp = 0; 18 19 for (int j = 0; j <= 30; ++j) 20 if (((num >> j) & 1) == 1) 21 tmp = Math.max(tmp, f[j]); 22 23 for (int j = 0; j <= 30; ++j) 24 if (((num >> j) & 1) == 1) 25 f[j] = Math.max(f[j], tmp + 1); 26 27 } 28 29 int ans = 0; 30 31 for (int i = 0; i <= 30; ++i) 32 ans = Math.max(ans, f[i]); 33 34 System.out.println(ans); 35 36 in.close(); 37 38 } 39 40 }
@Author: YouSiki
以上是关于BZOJ 4300: 绝世好题的主要内容,如果未能解决你的问题,请参考以下文章