Gym - 100989 L / M 【dfs / dp】
题目链接:http://codeforces.com/gym/100989/problem/L / http://codeforces.com/gym/100989/problem/M
题目大意:给定一个具有N项的表达式,求出最少修改符号次数使得表达式的和为0.
题目分析:
1.两道题的题意一模一样,区别在于数据范围不同。L题N的范围在20以内,但是表达式中每一项的值范围在 1e9 之内。M题的N范围在300之内,每一项的值范围在300之内。
2.所以L题用枚举,枚举每一种修改的情况取最少修改次数。M题无法枚举,但由于值的范围在300以内,表达式的和值的范围为 [-90000, +90000].所以用运用dp。
3.枚举用dfs即可。dp[i][j]表示前i项和为j时符号最少修改次数。下标不能为负,所以下标加上N项绝对值的和sum。使得 0 的意义是原本的 - sum, 2 * sum的意义是原本sum, sum的意义是原本的 0。那么dp[n][sum]就是我们所求的答案。
L代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
const int inf = 0x3f3f3f3f;
using namespace std; int arr[], n;
int ans = inf, flag = ; void dfs(int sum, int deep, int cnt)
{
if(deep == n - )
{
if(sum == )
{
flag = ;
ans = min(ans, cnt);
}
return ;
}
dfs(sum + arr[deep + ], deep + , cnt); //不改变符号
dfs(sum - arr[deep + ], deep + , cnt + ); //改变符号
return ;
} int main()
{
cin.sync_with_stdio(false);
char ch;
int x;
cin >> n >> arr[];
for(int i = ; i < n; i ++)
{
cin >> ch >> x;
if(ch == '-')
arr[i] = -x;
else
arr[i] = x;
}
dfs(arr[], , );
if(flag)
printf("%d\n", ans);
else
printf("-1\n");
}
L
M代码:
#include<iostream>
#include<string.h>
#include<algorithm>
#define mem(a, b) memset(a, b, sizeof(a))
const int MAXN = * + ;
const int inf = 0x3f3f3f3f;
using namespace std; int n, sum = ;
int arr[];
int dp[][MAXN]; //表示前i项的和为j时所改变的最少符号次数 int main()
{
cin.sync_with_stdio(false);
cin >> n;
cin >> arr[];
sum += arr[];
for(int i = ; i <= n; i ++)
{
char ch;
int x;
cin >> ch >> x;
sum += x;
if(ch == '+')
arr[i] = x;
else
arr[i] = -x;
}
if(sum % ) //绝对值的和为奇数的时候 不可能通过修改符号使得表达式的结果为0 例如, 1 1 1, 1 1 1 1 1
printf("-1\n");
else
{
mem(dp, inf);
dp[][sum + arr[]] = ;
for(int i = ; i <= n; i ++)
{
for(int j = ; j <= * sum; j ++)//枚举和
{
if(j >= arr[i])
dp[i][j] = min(dp[i][j], dp[i - ][j - arr[i]]);//满足可以不修改符号
if(j >= -arr[i])
dp[i][j] = min(dp[i][j], dp[i - ][j + arr[i]] + );//满足可以修改符号
}
}
if(dp[n][sum] == inf)
printf("-1\n");
else
printf("%d\n", dp[n][sum]);
}
return ;
}
M
Gym - 100989 L / M 【dfs / dp】的更多相关文章
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- Vijos 1523 贪吃的九头龙 【树形DP】
贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted ...
- 【数位DP】恨7不成妻
[数位DP]恨7不成妻 时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 4[提交] [状态] [命题人:admin] 题目描述 单身!依然单身! 吉哥依然单身!DS级码农吉哥依 ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- CodeVS 1226 倒水问题【DFS/BFS】
题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...
- 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】
算法提高 矩阵乘法 时间限制:3.0s 内存限制:256.0MB 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要 ...
- Vijos 1565 多边形 【区间DP】
描述 zgx给了你一个n边的多边形,这个多边形每个顶点赋予一个值,每条边都被标上运算符号+或*,对于这个多边形有一个游戏,游戏的步骤如下:(1)第一步,删掉一条边:(2)接下来n-1步,每步对剩下的边 ...
- Vijos 1451 圆环取数 【区间DP】
背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...
- 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树
[树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...
随机推荐
- 多个idea项目使用同一个tomcat
配置好tomcat后,每个项目使用不同的虚拟路径.并且把tomcat端口改为不一样的就可以了.
- crypot.js 生成hash256, 在IE下的卡顿问题。
项目需求: 上传大文件,调用crypto.js生成hash256码. 直接上传大文件,IE会直接崩溃. 于是利用file.slice分片检测.但是浏览器会出现卡顿问题.开始以为是内存泄漏.但看服务器进 ...
- 015_linuxC++之_覆写
34.类成员函数的重载.覆盖和隐藏区别?答案:a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函 ...
- LA 6972 Domination
6972 Domination Edward is the headmaster of Marjar University. He is enthusiastic about chess and of ...
- HMM 隐马尔科夫 Python 代码
import numpy as np # -*- codeing:utf-8 -*- __author__ = 'youfei' # 隐状态 hidden_state = ['sunny', 'rai ...
- [Linux]虚拟机无法安装deepin15.9的解决方案
虚拟机deepin15.9无法安装 sda assuming drive cache write through 显示内存不行,重启仍然无法安装 解决方案: 选择全盘安装方式 如果有全屏问题,需安装v ...
- Linux版本内核及安装后的简单操作命令介绍
一.Linux的版本与内核 1.Linux发行版 Linux发行版= Linux内核+应用程序 Redhat,CentOS,Ubuntu,Suse,红旗,Mint,Fedora CentOS:社区版操 ...
- CodeForces 519D A and B and Interesting Substrings ——(奥义字符串)
题意:给出26个字母每个字母的价值,问字符串中有多少个满足以下条件的子串: 1.子串的第一个和最后一个相同 2.子串除了头和尾的其他字符的价值加起来和尾0 这题普通方法应该是O(n^2),但是在1e5 ...
- JS的数据储存格式
javaScript有三种数据存储方式,分别是:sessionStoragelocalStoragecookier 相同点:都保存在浏览器端,同源的 不同点:①传递方式不同cookie数据始终在同源的 ...
- Qt 互斥量 QMutex
QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...