题意

略。

\(\texttt{Data Range:}1\leq n\leq 80\)

题解

首先考虑初始状态怎么算答案。很明显直接数满足的不好数,用总的减去不满足的还比较好做。注意到所有不满足的是一段 \(0\),所以就没了。

然后考虑怎么算从一个初始状态转移到一个目标状态的步数。考虑邻项交换,发现肯定是贪心匹配最优。

所以说如果有一个目标序列的话那么就可以算出初始序列到这个序列的步数和这个序列的答案,于是就可以直接 DP 目标序列。(这个时候我们 DP 未被保护的对数的最小值)

设 \(f_{i,j,k}\) 表示当前考虑到第 \(i\) 位并且钦定这一位填 \(1\),移动了 \(j\) 次并且这一段前缀中有 \(k\) 个 \(1\) 时未被保护对数的最小值。实际上转移的话考虑枚举下一个 \(1\) 在哪里,这个时候可以算出中间一段 \(0\) 对答案的贡献和需要移动的步数,就能够转移了。

最后处理的时候枚举一下最终序列中最后一个 \(1\) 填的哪里就好了,时间复杂度 \(O(n^5)\)。由于我比较菜所以不会斜率优化做法。

代码

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=85;
ll n,tot,res,m,r,c;
ll x[MAXN],cnt[2],pos[MAXN],f[MAXN][MAXN*MAXN][MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
inline void chkmin(ll &x,ll y)
{
x=x<y?x:y;
}
inline ll binom(ll n)
{
return n*(n-1)/2;
}
int main()
{
m=binom(n=read());
for(register int i=1;i<=n;i++)
{
cnt[x[i]=read()]++;
x[i]?pos[cnt[1]]=i:1;
}
if(!cnt[0])
{
for(register int i=0;i<=m;i++)
{
printf("%d ",0);
}
return 0;
}
res=tot=binom(cnt[0]),memset(f,0x3f,sizeof(f));
for(register int i=1;i<=n;i++)
{
f[i][abs(pos[1]-i)][1]=binom(i-1);
for(register int j=0;j<=m;j++)
{
for(register int k=1;k<=i&&k<cnt[1];k++)
{
r=cnt[1]-k;
if(f[i][j][k]!=0x3f3f3f3f)
{
for(register int l=i+1;l<=n-r+1;l++)
{
c=j+abs(pos[k+1]-l);
if(c<=m)
{
chkmin(f[l][c][k+1],f[i][j][k]+binom(l-i-1));
}
}
}
}
}
}
for(register int j=0;j<=binom(n);j++)
{
for(register int i=cnt[1];i<=n;i++)
{
if(f[i][j][cnt[1]]!=0x3f3f3f3f)
{
chkmin(res,f[i][j][cnt[1]]+binom(n-i));
}
}
printf("%d ",tot-res);
}
}

CodeForces 1420E Battle Lemmings的更多相关文章

  1. CodeForces 题目乱做

    是个补题记录. 1419 除了 F 场上都过了. CF1419A Digit Game 这题好多人 FST 啊-- 考虑如果串长为奇数那么最后操作的肯定是第一个人,串长为偶数的最后操作的肯定是第二个, ...

  2. 贪心/构造/DP 杂题选做

    本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. Codeforces 738D. Sea Battle 模拟

    D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...

  5. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set乱搞

    D. One-Dimensional Battle ShipsTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...

  6. CodeForces 163B Lemmings 二分

    Lemmings 题目连接: http://codeforces.com/contest/163/problem/B Descriptionww.co As you know, lemmings li ...

  7. Codeforces Round #Pi (Div. 2) D. One-Dimensional Battle Ships set区间分解

    D. One-Dimensional Battle ShipsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/co ...

  8. 【42.86%】【Codeforces Round #380D】Sea Battle

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. Codeforces #380 div2 D(729D) Sea Battle

    D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...

随机推荐

  1. 使用jsonify返回json数据

    from flask import Flask, jsonify app = Flask(__name__) json_data = [ {"name":"json&qu ...

  2. Cypress系列(60)- 运行时的截图和录屏

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 背景 在测试运行时截图和录屏能够在测试错 ...

  3. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  4. Java安全之Commons Collections1分析前置知识

    Java安全之Commons Collections1分析前置知识 0x00 前言 Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分.Apache C ...

  5. JVM 内存分配和占用

    我们从一个简单示例来引出JVM的内存模型 简单示例 我从一个简单示例谈起这一块,我在看一篇文章的时候看到这么一个场景并且自己做了尝试,就是分配一个2M的数组,使用Xmx即最大内存为12M的话,会报错J ...

  6. regsvr32 bypass windows defender 新思路

    原文链接:blog 在对regsvr32的用法进行了解之后,对于Casey Smith的远程js脚本执行命令的思路很感兴趣. 命令语法如下: regsvr32 /s /n /u /i:http://1 ...

  7. Fedora version history --- kernel version

    Fedora version history https://en.wikipedia.org/wiki/Fedora_version_history     Version (Code name)[ ...

  8. 多测师讲解requests __中_高级讲师肖sir

    (1)生成报告 import unittest #导入单元测试框架 import requests #导入接口库 import time # #时间戳,导入time模块 from api.HTMLTe ...

  9. MeteoInfo脚本示例:GrADS to netCDF

    这里给出一个将GrADS数据文件转为netCDF数据文件的脚本示例程序,其它格式数据转netCDF可以参考: #-------------------------------------------- ...

  10. nullptr解决了什么问题

    从0到NULL 在C++的世界中字面值0用来表示空指针,所以0可以当作所有指针类型的字面值.为了让语义更明确引入了NULL宏定义: #undef NULL #ifdef __cplusplus #de ...