博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 582B Once Again
阅读量:5909 次
发布时间:2019-06-19

本文共 1346 字,大约阅读时间需要 4 分钟。

题目大意:给出一个序列,是由一个长度为n的序列复制T次得到的,问最长非下降子序列的长度。

思路:我们建立一个n*n的矩阵,a[i][j]代表第一段以i为末尾,第二段以j为末尾,拼接起来能增加多少长度,这样只要有一个空的矩阵c,我们让c乘上a^t,记住,这里的乘里面是:c[i][j]=max(c[i][j],a[i][k]*b[k][j]),略微和其他的矩乘不同。然后c里面元素最大那个就是答案。

1 #include
2 #include
3 #include
4 #include
5 #include
6 struct Matrix{ 7 int n,r[105][105]; 8 }a,c; 9 int n,T,b[200005];10 int read(){11 int t=0,f=1;char ch=getchar();12 while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;ch=getchar();}13 while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}14 return t*f;15 }16 Matrix operator *(Matrix a,Matrix b){17 Matrix c;18 c.n=a.n;19 for (int i=1;i<=a.n;i++)20 for (int j=1;j<=a.n;j++)21 c.r[i][j]=-99999999;22 for (int i=1;i<=a.n;i++)23 for (int j=1;j<=a.n;j++)24 for (int k=1;k<=a.n;k++)25 c.r[i][j]=std::max(c.r[i][j],a.r[i][k]+b.r[k][j]);26 return c; 27 }28 int main(){29 n=read();T=read();30 for (int i=1;i<=n;i++)31 for (int j=1;j<=n;j++)32 a.r[i][j]=c.r[i][j]=0;33 for (int i=1;i<=n;i++) b[i]=read();34 for (int i=1;i<=n;i++)35 for (int j=1;j<=n;j++)36 if (b[i]<=b[j]) {37 a.r[i][j]=1;38 for (int k=1;k

 

转载于:https://www.cnblogs.com/qzqzgfy/p/5624683.html

你可能感兴趣的文章
技术分享:阿里巴巴Dubbo实现的源码分析
查看>>
TiDB 助力东南亚领先电商 Shopee 业务升级
查看>>
神级命令awk之30分钟速成必看
查看>>
聊聊flink的FsCheckpointStreamFactory
查看>>
【进阶1-4期】JavaScript深入之带你走进内存机制
查看>>
[LeetCode] 270. Closest Binary Search Tree Value
查看>>
表格的增删改demo
查看>>
7.JS之深浅拷贝
查看>>
Swoole 源码分析——Server模块之TaskWorker事件循环
查看>>
Slog63_项目上线之ArthurSlog个人网站上线2
查看>>
bat批处理简介:Windows自动化之道
查看>>
Python之路--python基础2
查看>>
帆软入门与报表设计
查看>>
【Golang 基础】Go 语言简介
查看>>
数组循环删除的问题
查看>>
聊聊openmessaging的MessagingAccessPoint
查看>>
周锦民:腾讯在线教育视频互动直播间技术实践
查看>>
iOS 视频播放器-模块化您的控制层
查看>>
Java 10 实战第 1 篇:局部变量类型推断
查看>>
vue中的computed属性
查看>>