Educational Codeforces Round 59 (Rated for Div. 2)

D. Compression

题目链接:https://codeforces.com/contest/1107/problem/D

题意:

给出一个n*(n/4)的矩阵,这个矩阵原本是一些01矩阵,但是现在四个四个储存进二进制里面,现在给出的矩阵为0~9以及A~F,表示0~15。

然后问这个矩阵能否压缩为一个(n/x)*(n/x)的矩阵,满足原矩阵中大小为x*x的子矩阵所有数都相等(所有子矩阵构成整个原矩阵)。

题解:

我想的就是暴力,但题解似乎也是暴力,但题解的做法比我的做法要优美许多。我说说我的吧...

就是先看看横排能否压缩,找出所有能够压缩的v值,然后将v从大到小进行枚举,来看看列能否照样压缩,能就直接输出答案。

大体思路就是这样,但我写的代码比较复杂...其实对于将字符解码为二进制,用个二维数组就可以了...

题解的暴力就是直接几层循环枚举完事。

下面给出我的代码...

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n;
char s[N][N];
vector <int> vec;
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%s",s[i]);
for(int i=;i<=n;i++){
int flag=;
if(n%i!=) continue ;
for(int j=;j<n;j++){
if(strcmp(s[(j/i)*i],s[j])!=){
flag=;
break ;
}
}
if(flag) vec.push_back(i);
}
reverse(vec.begin(),vec.end());
int flag;
for(auto v:vec){
flag=;
for(int i=;i<n;i+=v){
vector <int> a;
for(int j=;j<n/;j++){
char c = s[i][j];
int now;
if(c>='A' && c<='F') now=c-'A'+;
else now=c-'';
for(int k=;k>=;k--){
if((<<k)&now) a.push_back();
else a.push_back();
}
}
for(int k=;k<n;k++){
if(a[(k/v)*v]-''!=a[k]-''){
flag=;
break ;
}
}
if(!flag) break ;
}
if(flag){
cout<<v;
return ;
}
}
return ;
}

E. Vasya and Binary String

题目链接:https://codeforces.com/contest/1107/problem/E

题意:

给出一个01串,然后对这个串进行压缩,将长度为1,2....n的相同字符进行压缩会得到相应的权值。问怎样压缩可以得到最大的值。

题解:

这题考虑dp,因为压缩只有两种情况,要么压缩一个,要么压缩多个,这个压缩多个可以连续,也可以中间有间隔。

dp(i,j,k)表示起点为i,终点为j,压缩k个和si相同的字符所得到的最大代价。

转移的话就有两种:

1.dp(i,j,1)=max{dp(i+1,j,p)}+a[1];

2.dp(i,j,k)=max{dp(i+1,pos-1,p)}+dp(pos,j,k-1)-ak-1+ak.

这里面的max我是直接枚举得到最大值,然后dp的过程中枚举pos来进行转移。

详细见代码吧:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = ;
ll a[N];
ll dp[N][N][N];
char s[N];
int n;
int main(){
scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=n;i++) cin>>a[i];
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) dp[i][i][]=a[];
for(int i=n-;i>=;i--){
for(int j=i+;j<=n;j++){
for(int k=;k<=j-i;k++)
dp[i][j][]=max(dp[i][j][],dp[i+][j][k]+a[]);
for(int q=i+;q<=j;q++){
ll tmp=;
if(s[q]!=s[i]) continue ;
for(int p=;p<=q-i-;p++) tmp=max(tmp,dp[i+][q-][p]);
for(int k=;k<=j-i+;k++){
if(dp[q][j][k-]) dp[i][j][k]=max(dp[i][j][k],tmp+dp[q][j][k-]-a[k-]+a[k]);
}
}
}
}
ll ans = ;
for(int i=;i<=n;i++) ans=max(ans,dp[][n][i]);
cout<<ans;
return ;
}

Educational Codeforces Round 59 (Rated for Div. 2) DE题解的更多相关文章

  1. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...

  2. Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)

    https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...

  3. C. Brutality Educational Codeforces Round 59 (Rated for Div. 2) 贪心+思维

    C. Brutality time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  4. Educational Codeforces Round 59 (Rated for Div. 2)

    熬夜爆肝,智商急剧下降 坐标UTC+8晚上23:35开始 晚上脑袋转的慢,非常慢 T1上来先做还花了好几分钟 T2本来是有式子的我TM写数位DP写炸了然后才发现是有公式 T3英语不好,一开始题意没读懂 ...

  5. 【考试记录】Educational Codeforces Round 59 (Rated for Div. 2)

    本来准备划水,结果被垃圾题艹翻了…… T2题意: 定义一个数$x$的数字根$S(x)$为:将其各位数字相加得到一个新数,再将新数的数字和相加直到得到一个个位数,就是该数的数字根. 例如:$S(38)= ...

  6. Educational Codeforces Round 59 (Rated for Div. 2) (前四题)

    A. Digits Sequence Dividing(英文速读) 练习英语速读的题,我还上来昏迷一次....只要长度大于2那么一定可以等于2那么前面大于后面就行其他no 大于2的时候分成前面1个剩下 ...

  7. Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF题解

    题目总链接:https://codeforces.com/contest/1096 A. Find Divisible 题意: 给出l,r,在[l,r]里面找两个数x,y,使得y%x==0,保证有解. ...

  8. Educational Codeforces Round 54 (Rated for Div. 2) DE

    D 给出一个无向图,需要删去一些边,想知道最后能有多少个点到1的距离还是过去那么短 如果求一个最短路,然后从删边的角度看,看起来很难做,但是如果从零开始加边就会有做法,如同prim那样,先加入和1直接 ...

  9. Educational Codeforces Round 80 (Rated for Div. 2)部分题解

    A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...

随机推荐

  1. 学习python第一天 pycharm设置

    print(“hello,world”) pycharm设置 1. 选择python 解析器,目的是确定pycharm 的运行环境. 方法: File-->Settings-->Proje ...

  2. 004---os & sys

    os模块和sys模块 这两个模块都提供了很多与操作系统之间交互的功能 使用 import os #当前脚本的工作目录,不是脚本目录 print(os.getcwd()) # 获取指定目录下的所有文件和 ...

  3. Go语言中的UDP应用

    Go语言中的UDP应用 Go语言中使用UDP是很方便的,net包提供了UDP和TCP的功能,这里使用UDP做了一个UDP广播,然后接收各个设备的返回信息.实现起来很快,总体感觉比使用C#中的UDP更优 ...

  4. R语言学习笔记(三):零碎知识点(1-10)

    1--c() c表示"连接"(concatenate). 在R中向量是连续存储的,因此不能插入或删除元素. 2--seq() seq()的特殊用法,可以用在for循环里for(i ...

  5. vue2018年5月报错No parser and no file path given

    mac电脑直接: rm -rf node_modules rm package-lock.json npm install npm install prettier@~1.12.1 执行完这四个命令, ...

  6. Linux设定IP地址

    下面这些内容是直接从其他地方扒拉过来的,后期根据自己使用情况修改补充 虚拟机的连接方式 1.NAT(网络地址转换,虚拟机可以上网,但不能和物理机通信)-----VMnet82.host only(主机 ...

  7. jmeter更改启动编码设置

    项目中碰到这样的问题,在eclipse经过utf-8转码的代码,能正常运行,放到了jmeter里面运行,就是乱码,如下: String s = "乔佳飞"; String ss = ...

  8. 算法搬运之BFPRT算法

    原文连接:http://noalgo.info/466.html BFPRT算法,又称为中位数的中位数算法,由5位大牛(Blum . Floyd . Pratt . Rivest . Tarjan)提 ...

  9. 创建vpc网络

    vpc相关功能点: 模块 功能点 描述 备注 VPC 创建vpc网络 创建vpc网络,指定vpc网络名称   修改vpc网络 修改vpc网络名称   删除vpc网络 删除vpc网络   vpc相关命令 ...

  10. docker容器中启动kvm虚拟机

    .安装docker yum install docker systemctl start docker.service systemctl enable docker.service .拉取cento ...