当前位置: 首页 > news >正文

Codeforces Round #384 (Div. 2) E

给出n个数字 1-8之间 要求选出来一个子序列 使里面1-8的数字个数 极差<=1 并且相同数字必须相邻(112 可以但是121不行)求这个子序列的最长长度 

一道状压dp 看不懂别人的dp思想..自己造了一个出来..

首先枚举t 意义是 当前选取子序列 每个数字最少是多少 那么这个子序列中的数字个数为t t+1

dp[i][j]当前在i位 选取数字的情况压缩成j

枚举没选过的数字 用前缀和进行二分查找

从第i位开始 求出res使在满足i-res这个区间有t或者t+1的某数字 进行转移 更新dp[res][j|x] 

当t为0的时候和t>0的时候 一个是 某种数字不选也可以 一个是每种数字都会被选择 所以分开来讨论

前者就是统计出现过的数字的种数

后者 当j|x为11111111 即每种数字都选完的时候 这时候才会满足 数字个数为t或者t+1 才可以进行对ans的更新

时间复杂度 n^2 * (255) * log(n)

一道题补了两天...期间打了好久游戏...QAQ

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<vector>
#include<queue>
#include<malloc.h>
using namespace std;
#define L long long
int n ;
int dp[1050][(1<<8) + 5];
int a[1050];
int b[(1<<8) + 5];
int sum[1050][9];
int main(){
    scanf("%d",&n);
    memset(sum,0,sizeof(sum));
    int ans = 0;
    int mj = (1<<8) - 1;
    for(int i=0;i<=mj;i++){
        int z = i;
        b[z] = 0;
        while(z){
            if(z%2 == 1)b[i] ++;
            z/=2;
        }
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        for(int j=1;j<=8;j++)sum[i][j] = sum[i-1][j];
        sum[i][a[i]] ++ ;
    }
    for(int i=1;i<=8;i++){
        if(sum[n][i]>0)ans++;
    }
    for(int t=1;t*8<=n;t++){
        memset(dp , -1 ,sizeof(dp));
        dp[0][0] = 0;
        for(int i=0;i<n;i++){
            for(int j=0;j<=mj;j++){
                if(dp[i][j] == -1)continue;
                for(int k=1;k<=8;k++){
                    int z = (1<<(k-1));
                    if((z&j) == 0){
                        int g=(z|j);
                        int l = i+1;
                        int r = n;
                        int res = -1;
                        while(l<=r){
                            int mid =(l+r)/2;
                            if(sum[mid][k] - t > sum[i][k]){
                                r = mid - 1;
                            }
                            else if(sum[mid][k] - t < sum[i][k]){
                                l = mid + 1;
                            }
                            else {
                                r = mid - 1;
                                res = mid;
                            }
                        }
                        if(res != -1){
                            if(dp[res][g] == -1 || dp[res][g] < dp[i][j] + t){
                                dp[res][g] = dp[i][j] + t;
                                if(b[g] == 8)
                                    ans = max(dp[res][g] , ans);
                            }
                        }
                        l = i+1;
                        r = n;
                        res = -1;
                        while(l<=r){
                            int mid =(l+r)/2;
                            if(sum[mid][k] - t - 1> sum[i][k]){
                                r = mid - 1;
                            }
                            else if(sum[mid][k] - t - 1< sum[i][k]){
                                l = mid + 1;
                            }
                            else {
                                r = mid - 1;
                                res = mid;
                            }
                        }
                        if(res != -1){
                            if(dp[res][g] == -1 || dp[res][g] < dp[i][j] + t + 1){
                                dp[res][g] = dp[i][j] + t + 1;
                                if(b[g] == 8)
                                    ans = max(dp[res][g] , ans);
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d\n",ans);
}

  

 

转载于:https://www.cnblogs.com/rayrayrainrain/p/6186661.html

相关文章:

  • 烂泥:python2.7和python3.5源码安装
  • 小改动
  • 部署web
  • 五一长假日记(1)
  • 【我拼搏的2016】-Python进行时
  • 关于建立控件、组件开发团队,有兴趣的网友请留言
  • mac安装tensorflow报错
  • 写跨浏览器脚本需要注意的问题
  • MySQL在Ubuntu系统的三种自启动方法
  • .net 程序发生了一个不可捕获的异常
  • SpringMVC学习笔记(一)
  • C#操作Excel,套用模板并对数据进行分页
  • 【SC】SCOM配置AD集成
  • 去了一趟微软
  • 设计模式的有趣解释-追MM
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Android 架构优化~MVP 架构改造
  • IDEA 插件开发入门教程
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript异步流程控制的前世今生
  • 阿里云购买磁盘后挂载
  • 对象引论
  • 番外篇1:在Windows环境下安装JDK
  • 简析gRPC client 连接管理
  • 小程序01:wepy框架整合iview webapp UI
  • - 转 Ext2.0 form使用实例
  • No resource identifier found for attribute,RxJava之zip操作符
  • 如何在招聘中考核.NET架构师
  • 正则表达式-基础知识Review
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (ibm)Java 语言的 XPath API
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校实验室 毕业设计 800008
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十三)Maven插件解析运行机制
  • (转载)OpenStack Hacker养成指南
  • .Family_物联网
  • .Net 4.0并行库实用性演练
  • .net core 连接数据库,通过数据库生成Modell
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET成年了,然后呢?
  • .Net中wcf服务生成及调用
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [acm算法学习] 后缀数组SA
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [android] 手机卫士黑名单功能(ListView优化)
  • [android学习笔记]学习jni编程
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数