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. ATM购物车程序项目规范(更新到高级版)

    ATM购物车程序(高级版) 之前的低级版本已经删除,现在的内容太多,没时间把内容上传,有时间我会把项目源码奉上! 我已经把整个项目源码传到群文件里了,需要的可以加主页qq群号.同时群内也有免费的学习资 ...

  2. 毕业2年 Summary

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/135 看了下去年写毕业一周年总结的时间:2017-6-16,今天 ...

  3. 微信公众号--JS-SDK

    JS-SDK 微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以 ...

  4. R语言学习笔记(十一):零碎知识点(26-30)

    26--aggregate( ) 函数aggregate()对分组中的每一个变量调用tapply()函数. aggregate(a,list,f) 第二个参数必须是列表.也就是因子部分. 第三个参数即 ...

  5. git之解决冲突

    前面几次使用git,一直对于冲突的这个问题不是很理解,感觉有些时候就会产生冲突,在此记录一下解决冲突的流程 1.git bash上面冲突显示 2.在idea上面可以看到冲突的文件 3.去解决冲突 4. ...

  6. svn 服务器搭建 (Linux)

    1.svn目前在程序开发工程汇总应用非常普遍,所以学习svn的环境搭建还是很有必要的 2.本次安装的服务是Subversion(svn)针对的环境是Linux,Subversion(SVN) 是一个开 ...

  7. VM打开虚拟机文件报错

    用VM打开以前的虚拟机文件报错 Cannot open the disk 'F:/****.vmdk' or one of the snapshot disks it depends on. 这种问题 ...

  8. 《.NET 微服务:适用于容器化 .NET 应用的体系结构》关键结论

    作为总结和要点,以下是本指南中最重要的结论.1 使用容器的好处: 基于容器的解决方案有节约成本的好处,因为容器是针对生产环境中缺少依赖而导致的部署问题提出的解决方案.容器能够显著改善devops和生产 ...

  9. 阅读MDN文档之布局(四)

    Introducing positioning Static positioning Relative positioning Introducing top, bottom, left and ri ...

  10. mysql8.0.14 安装

    1.下载 地址:https://dev.mysql.com/downloads/mysql/ 找到zip压缩文件. 2.配置环境变量 把解压后的路径配置到环境变量中 3.安装 在解压后的文件夹中新建m ...