Codeforces Round #612 (Div. 1) A. Garland(dp动态规划)

2023-10-30 04:08

本文主要是介绍Codeforces Round #612 (Div. 1) A. Garland(dp动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:https://codeforc.es/contest/1286/problem/A

Vadim loves decorating the Christmas tree, so he got a beautiful garland as a present. It consists of n light bulbs in a single row. Each bulb has a number from 1 to n (in arbitrary order), such that all the numbers are distinct. While Vadim was solving problems, his home Carp removed some light bulbs from the garland. Now Vadim wants to put them back on.

在这里插入图片描述

Vadim wants to put all bulb back on the garland. Vadim defines complexity of a garland to be the number of pairs of adjacent bulbs with numbers with different parity (remainder of the division by 2). For example, the complexity of 1 4 2 3 5 is 2 and the complexity of 1 3 5 7 6 4 2 is 1.

No one likes complexity, so Vadim wants to minimize the number of such pairs. Find the way to put all bulbs back on the garland, such that the complexity is as small as possible.

Input
The first line contains a single integer n (1≤n≤100) — the number of light bulbs on the garland.

The second line contains n integers p1, p2, …, pn (0≤pi≤n) — the number on the i-th bulb, or 0 if it was removed.

Output
Output a single number — the minimum complexity of the garland.

Examples

input

5
0 5 0 2 3

output

2

input

7
1 0 0 5 0 0 2

output

1

题意

有 1 ~ n 的数,将剩余的数填到 pi 为 0 的位置上,使得相邻数奇偶不同的对数最少。

分析

设 f[i][j][k][x] 表示到 i 位置,前面共填了 j 个奇数, k 个偶数进去,当前位置为 x 数( x 为 0 表示偶数,为 1 表示奇数)。

初始化所有 f 都设为极大值。

状态转移方程有:

  1. 如果第一个数为 0 ,则 f[1][0][1][0] = f[1][1][0][1] = 0 ;如果已经是奇数或偶数,则 f[1][0][0][a[1] % 2] = 0
  2. 从 2 号位置开始遍历,如果 q[i] 为 0 ,则我们可以在这个位置放上奇数或偶数,遍历填入奇数偶数的个数所有情况,如果该位置放上奇数:f[i][j][k][1] = min(f[i - 1][j - 1][k][0] + 1, f[i - 1][j - 1][k][1]) ;如果放上偶数: f[i][j][k][0] = min(f[i - 1][j][k - 1][0], f[i - 1][j][k - 1][1] + 1)
  3. 如果 q[i] 为奇数或偶数,遍历填入奇数偶数的个数所有情况,f[i][j][k][q] = min(f[i - 1][j][k][q], f[i - 1][j][k][q ^ 1] + 1)
代码
#include<bits/stdc++.h>
using namespace std;int n;
int a[107],ji,ou,vis[107];
int f[107][107][107][2];int main()
{cin>>n;for(int i=1;i<=n;i++){scanf("%d",&a[i]);vis[a[i]] = 1;}for(int i=1;i<=n;i++)if(vis[i] == 0) i % 2 == 0 ? ou++ : ji++;memset(f, 0x3f3f3f3f, sizeof(f));int sum = 0;if(a[1] == 0) sum++, f[1][0][1][0] = f[1][1][0][1] = 0;else f[1][0][0][a[1] % 2] = 0;for(int i=2;i<=n;i++){if(a[i] == 0){sum++;for(int j=0;j<=min(sum, ji);j++){int k = sum - j;if(k > ou) continue;if(j >= 1)f[i][j][k][1] = min(f[i - 1][j - 1][k][0] + 1, f[i - 1][j - 1][k][1]);if(k >= 1)f[i][j][k][0] = min(f[i - 1][j][k - 1][0], f[i - 1][j][k - 1][1] + 1);}}else{int q = a[i] % 2;for(int j=0;j<=min(sum, ji);j++){int k = sum - j;if(k > ou) continue;f[i][j][k][q] = min(f[i - 1][j][k][q], f[i - 1][j][k][q ^ 1] + 1);}}}cout<<min(f[n][ji][ou][0],f[n][ji][ou][1]);return 0;
}

这篇关于Codeforces Round #612 (Div. 1) A. Garland(dp动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305481

相关文章

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要