• 0915 反思


    这场比赛还是打的很迷
    A题我居然没看出来是状态压缩
    B题本来是一道DP题 我脑抽 写了一发最短路..... 然后空间就超了
    C题打暴力只有30分 没有想到换根操作
    A

    N<=16!!!
    zz 一味地打表 然后居然认为这是一个求逆序对的题目...
    首先一看范围 状态压缩 这很显然
    (F[I])表示把集合i 里面的元素合并的最小步数
    考虑转移
    注意到 当集合为回文串的时候 只需要多操作一步
    所以 (F[I]=MIN(F[I)^(S]+1,F[I]))
    预处理回文串
    CODE:

    //
    #include<bits/stdc++.h>
    using namespace std;
    #define maxnn 100000
    int mark[1<<21];
    int all,n;
    int f[1<<21];
    char s[maxnn];
    int main() {
        scanf("%s",s+1);
        n=strlen(s+1);
        int all=(1<<n)-1;
        for(int i=0; i<=all; i++) {
            int l=0,r=0;
            for(int k=1; k<=n; k++) {
                if((1<<k-1)&i) {
                    l=k;
                    break;
                }
            }
            for(int k=n; k>=1; k--) {
                if((1<<k-1)&i) {
                    r=k;
                    break;
                }
            }
            if(s[l]!=s[r]) {
                mark[i]=0;
                continue;
            }
            if((l==0)||(r==0)) continue;
            while(l<=r) {
                while((!(i&(1<<l-1)))) l++;
                while((!(i&(1<<r-1)))) r--;
                if(s[l]!=s[r]) {
                    mark[i]=0;
                    f[i]=0;
                    break;
                }
                l++,r--; 
    		f[i]=1;
            mark[i]=1;
            }
           
        }
      
        for(int i=0; i<=all; i++) {
            for(int k=i; k; k=(k-1)&i) {
                if(mark[k]==1) {
                    if(f[i]==0)
                        f[i]=f[i^k]+1;
                    else
                    {
                        f[i]=min(f[i],f[i^k]+1);
                     
                    }
                }
            }
       
        }
      
        cout<<f[all];
    }
    

    B
     你得到了一个龙珠雷达,它会告诉你龙珠出现的时间和地点。
       龙珠雷达的画面是一条水平的数轴,每一个窗口时间,数轴的某些点上会出现同一种龙珠,每当你获得其中一颗龙珠,其它龙珠就会消失。下一个窗口时间,数轴上又会出现另一种龙珠。总共有n个窗口时间,也就是总共有n种龙珠。
      假设你会瞬间移动,你从数轴的x点移动到y点,耗时0秒,但是需要耗费|x-y|的体力。同时,挖出一颗龙珠也需要耗费一定的体力。请问,最少耗费多少体力,就可以收集齐所有种类的龙珠。

    这是一个树塔问题 我居然看成了最短路... 空间计算还出错了

    状态转移比较简单

    然后我们考虑打开绝对值
    然后你就会发现 对于 第i 层 的第j 个龙珠
    我们只需要 在左边找最小值 或者在右边找最小值
    考虑维护一个单调递增的序列即可

    C
    【题目背景】

    小奇采的矿实在太多了,它准备在喵星系建个矿石仓库。令它无语的是,喵星系的货运飞船引擎还停留在上元时代!

    【问题描述】

    喵星系有n个星球,星球以及星球间的航线形成一棵树。

    从星球a到星球b要花费[dis(a,b) Xor M]秒。(dis(a,b)表示ab间的航线长度,Xor为位运算中的异或)

    为了给仓库选址,小奇想知道,星球i(1<=i<=n)到其它所有星球花费的时间之和。


    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    python文本处理
    转 Deep Learning for NLP 文章列举
    backpropagation
    开发者必备的6款源码搜索引擎 转
    转【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)
    Sampling
    各种形式的熵函数,KL距离
    [转] 如何在ie11里使用a连接创建动态下载文件流
    修改chrome背景色
    [转] 使用 Spring 5 的 WebFlux 开发反应式 Web 应用
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11528597.html
Copyright © 2020-2023  润新知