题目链接: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】的更多相关文章

  1. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  2. Vijos 1523 贪吃的九头龙 【树形DP】

    贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted ...

  3. 【数位DP】恨7不成妻

    [数位DP]恨7不成妻 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 4[提交] [状态] [命题人:admin] 题目描述 单身!依然单身! 吉哥依然单身!DS级码农吉哥依 ...

  4. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  6. 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】

      算法提高 矩阵乘法   时间限制:3.0s   内存限制:256.0MB      问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要 ...

  7. Vijos 1565 多边形 【区间DP】

    描述 zgx给了你一个n边的多边形,这个多边形每个顶点赋予一个值,每条边都被标上运算符号+或*,对于这个多边形有一个游戏,游戏的步骤如下:(1)第一步,删掉一条边:(2)接下来n-1步,每步对剩下的边 ...

  8. Vijos 1451 圆环取数 【区间DP】

    背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...

  9. 【树形DP】洛谷P2585 [ZJOI2006] 三色二叉树

    [树形DP]三色二叉树 标签(空格分隔): 树形DP [题目] 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1 ...

随机推荐

  1. nginx之location部署yii项目(不使用nginx端口转发)

    前言: 之前部署yii项目的时候, 使用的是域名, 后来使用nginx进行端口转发(反向代理)来部署yii项目. 这一次部署尝试只使用location 进行部署(不需要使用端口). 先贴出nginx的 ...

  2. sfmlearner剖析

    下面是slam14讲公式5.7 $Z\left(\begin{array}{l}{u} \\ {v} \\ {1}\end{array}\right)=\left(\begin{array}{ccc} ...

  3. node中的crypto内置模块

    crypto模块的目的是为了提供通用的加密和哈希算法.用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢.Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaS ...

  4. java中的变量和数据类型

    变量和javascript的变量含义一样 在Java中,变量分为两种:基本类型的变量和引用类型的变量.(javascript中同样是这样的) 基本数据类型 基本数据类型是CPU可以直接进行运算的类型. ...

  5. [svn]指定用户名

    svn [option] --username=faith --passward=521 或者 svn [option] --username "faith" --passward ...

  6. [51nod1666] 最大值

    题面 题解 毒瘤题浪费我大好青春 容易知道, 如果\(l\)和\(r\)位数不一样, 直接选形似\(99..99\)的数, 输出答案即可 \(l\)和\(r\)位数一样的话, 当位数确定的时候, 由于 ...

  7. MongDB的DateZone

    先理解:Date本身是没有格式的,只是一个毫秒数,要显示成某种格式就一定是字符串 https://github.com/ewcmsfree/ewcms/wiki/Help-mongo-java-dri ...

  8. 状压dp,松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间。

    UVA10944 松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间. #include<iostream> #include<cstdio> #include<al ...

  9. [Java]使用Collections.Max,Min方法取集合类的最大最小值

    代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...

  10. AVQueuePlayer

    想要视频一个接一个的无缝连续播放么? 还在用mpmovieplayercontroller么?out了! 介绍一个可以实现无缝连续播放视频的东西-------AVQueuePlayer ! AVQue ...