[dp]vijos1063 迎春舞会之集体舞

题目梗概

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

思考

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

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

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

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

为什么?看着组数据

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

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

另一个同样方法。

代码实现

#include <cstdio>
#include <cstring>
#include <algorithm>

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);
}
时间: 2024-10-10 13:11:49

[dp]vijos1063 迎春舞会之集体舞的相关文章

18.03.25 vijos1063迎春舞会之集体舞

背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 描述 表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下).而就每个人,他有可能正面朝前(小的向前正三角形).或向后三角形(小的向后正三角形). 然而这些人在服装上有明显区别——一部分穿冬季校服,其他的穿夏季校服. 现在给出每个人的着衣情况,请你求穿夏季校服的同学所构成的最大正三角形,输出所含人数. 格式 输入格式 第一排为n. 接下来n排,第i排有2*i-1个有效字符(‘#’或‘-’,分别表示此同学穿冬季校服或穿夏季校服).输入

tyvj1192 迎春舞会之集体舞

背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 描述 表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下).而就每个人,他有可能正面朝前(小的向前正三角形).或向后三角形(小的向后正三角形).    然而这些人在服装上有明显区别——一部分穿冬季校服,其他的穿夏季校服.    现在给出每个人的着衣情况,请你求穿夏季校服的同学所构成的最大正三角形,输出所含人数.     输入格式 第一排为n.    接下来n排,第i排有2*i-1个有效字符(‘#’或‘-’,分别表示此同学穿冬季校服

Vijos P1061 迎春舞会之三人组舞 DP

题目链接:https://vijos.org/p/1061 n个人选出3*m人,排成m组,每组3人. 站的队形——较矮的2个人站两侧,最高的站中间. 从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低. 计算公式为 h=(a-b)^2 (a.b为较矮的2人的身高)现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低; input: 第一排为m,n. 第二排n个数字,保证升序排列. 思路:由于和中间高的人无关,但是每次选旁边两个的时候,会由于没有比这

Vijos P1063 迎春舞会之交谊舞 DP

题目链接:https://vijos.org/p/1063 题意:有n(n <= 100)行,每行有2*i-1个可显字符'#'与'-',组成一个倒三角形,问由'-'组成的最大三角形的'-'的个数为多少? 思路:顶点为倒三角,即行列奇偶相同:对于一个顶点可以扩展的最大边长首先需要上面三角为'-',这样只需建立在顶点上一行的左右两个点的最大边长即可: 三角形个数就是边长的平方: ps:开始我想的是从列的角度看轴线的左右两边的min,然后模拟行.真是醉了. #include<iostream>

tyvj1191 迎春舞会之三人组舞

背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞 描述 n个人选出3*m人,排成m组,每组3人.    站的队形——较矮的2个人站两侧,最高的站中间.    从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低.    计算公式为  h=(a-b)^2  (a.b为较矮的2人的身高)    那么问题来了.    现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低. 输入格式 第一排为m,n.    第二排n个数字,保证升序排列. 输出格式 输

洛谷P1538迎春舞会之数字舞蹈

题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈”.顾名思义就是所有人一起排成若干个数字 -___-|||| 更为创新的是,每个人都是趴在地上,保证横竖. 现在给出数字及其要求摆出的大小,请你编程,模拟同学们的优美姿态. 输入输出格式 输入格式: 第一行为k.k表示要摆出数字的大小. 第二行为全部由数字组成的字符串,即要摆出的几个数字. 输出格式

Vijos P1062 迎春舞会之交谊舞

题目链接:https://vijos.org/p/1062 题意:输入n(n <= 1500)个女生左边有多少个男生.每个女生都和她左边最近的男生跳舞. 输出每个女生到可以与之跳舞的男生之间有几个男生;(包括跳舞的男生) input 64 5 6 6 6 6output 1 1 1 4 5 6 思路:简单的递推即可:并没有用到栈..对于第i个女生,易知当该女生左边男生的数量比前一个女生的数量多时,结果就是1.但是当出现连续的相等时,即表示这些女生之前没有男生,这时我们就需要先前找"可用&q

【模拟】Vijos P1062 迎春舞会之交谊舞

题目链接: https://vijos.org/p/1062 题目大意: 一群男女站成一排,一男一女配对,女的只找左边第一个空闲的男生,给定前n个女生左边的额男生个数,问前n个女生到男伴之间共有几个男生.(n<=1500 女生左侧男生231内) 题目思路: [模拟] 每个女生只找左边的最靠近的闲置男生,所以每当女生左边的男生数变化的时候就说明队伍里加入了新的男生,而这些男生只会影响右侧的女生. 所以我一开始想到,把男生分成好多群,加入一个女生完把最靠近她的男生群最右的男生配对给这个女生,然后该男

[SinGuLaRiTy] 动态规划题目复习

[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲