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 ...
随机推荐
- nginx之location部署yii项目(不使用nginx端口转发)
前言: 之前部署yii项目的时候, 使用的是域名, 后来使用nginx进行端口转发(反向代理)来部署yii项目. 这一次部署尝试只使用location 进行部署(不需要使用端口). 先贴出nginx的 ...
- sfmlearner剖析
下面是slam14讲公式5.7 $Z\left(\begin{array}{l}{u} \\ {v} \\ {1}\end{array}\right)=\left(\begin{array}{ccc} ...
- node中的crypto内置模块
crypto模块的目的是为了提供通用的加密和哈希算法.用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢.Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaS ...
- java中的变量和数据类型
变量和javascript的变量含义一样 在Java中,变量分为两种:基本类型的变量和引用类型的变量.(javascript中同样是这样的) 基本数据类型 基本数据类型是CPU可以直接进行运算的类型. ...
- [svn]指定用户名
svn [option] --username=faith --passward=521 或者 svn [option] --username "faith" --passward ...
- [51nod1666] 最大值
题面 题解 毒瘤题浪费我大好青春 容易知道, 如果\(l\)和\(r\)位数不一样, 直接选形似\(99..99\)的数, 输出答案即可 \(l\)和\(r\)位数一样的话, 当位数确定的时候, 由于 ...
- MongDB的DateZone
先理解:Date本身是没有格式的,只是一个毫秒数,要显示成某种格式就一定是字符串 https://github.com/ewcmsfree/ewcms/wiki/Help-mongo-java-dri ...
- 状压dp,松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间。
UVA10944 松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间. #include<iostream> #include<cstdio> #include<al ...
- [Java]使用Collections.Max,Min方法取集合类的最大最小值
代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...
- AVQueuePlayer
想要视频一个接一个的无缝连续播放么? 还在用mpmovieplayercontroller么?out了! 介绍一个可以实现无缝连续播放视频的东西-------AVQueuePlayer ! AVQue ...