博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[dp]vijos1063 迎春舞会之集体舞
阅读量:5012 次
发布时间:2019-06-12

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

题目梗概

一个大的三角形,其中有向下的正三角形和向上的正三角形。求最大的正三角的组成人数(阴影部分不能算入)

 

思考

这道题目卡了我好长时间,题目和之前做过的最大正方形有异曲同工之妙。只不过这道题目需要额外的处理一下。

首先我们看下向下的正三角如何求?

手动模拟会发现,和最大正方形类似。在i行j列的三角形的大小是受 (i-1,j) (i-1,j+1) (i-1,j-1) 这三个三角形的限制。这个我就不证明了。。

不过需要注意的是只有向下的三角形才能组成正三星形,这个怎么处理呢?每次记录Max值的之后判断一下这个三角形是不是向下的就可以了,如果不是就不用记录。

为什么?看着组数据

10
------------#####--
 --#-----#-#--#---
  --#----#---#---
   -------#--#--
    --#-#------
     -----##--
      ---#---
       -----
        ---
         -

 

 

因为我们是在计算向下的三角形,所以不应该去考虑向上的三角形,但是不能忽略它的dp值,因为向上向下的三角形是一起参与构图的。

 

另一个同样方法。

 

代码实现

#include 
#include
#include
int n,map[105][205],dp[105][205],Max=-1;char s[233];int main(){ memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); scanf("%d",&n); int pos = n*2+1; for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=pos-i*2;j++){ if(s[j]=='-') map[i][j+i-1]=1; } } for(int i=1;i<=n;i++){ for(int j=i;j<=n*2-i;j++){ if(map[i][j]){ dp[i][j] = std::min(dp[i-1][j],std::min(dp[i-1][j+1],dp[i-1][j-1]))+1; if( (j-i+1)&1 )Max = std::max(dp[i][j],Max);//判断奇偶 } } } //记得赋值 memset(dp,0,sizeof(dp)); for(int i=n;i>=1;i--){ for(int j=i;j<=n*2-i;j++){ if(map[i][j]){ dp[i][j] = std::min(dp[i+1][j],std::min(dp[i+1][j+1],dp[i+1][j-1]))+1; if( !((j-i+1)&1) )Max = std::max(dp[i][j],Max);//偶数就判断 } } } //正三角形这个计算没啥说的 printf("%d\n",Max*Max);}

 

转载于:https://www.cnblogs.com/OIerLYF/p/7351921.html

你可能感兴趣的文章
MySQL性能测试工具之mysqlslap使用详解
查看>>
深入理解jsonp跨域请求原理
查看>>
regsvr32注册COM组件失败
查看>>
jmeter,CSV数据加载、数据库连接、正则
查看>>
(独孤九剑)--正则表达式
查看>>
MySQL学习点滴 --分区表
查看>>
4.6.1 测试基础
查看>>
洛谷 P2486 [SDOI2011]染色
查看>>
oo第三单元总结
查看>>
leetcode : Count and Say [基本功]
查看>>
洛谷 P2485 [SDOI2011]计算器 解题报告
查看>>
c#访问存储过程
查看>>
Slickflow.NET 开源工作流引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
查看>>
Node教程
查看>>
java将字段映射成另一个字段,关于 接口传参 字段不对应转换
查看>>
Redis
查看>>
字段和属性的区别
查看>>
HTTP(一)工作机制
查看>>
条形码扫描枪数据读取的问题
查看>>
$this->autoRender = false
查看>>