题解 【POJ1722】 SUBTRACT
先讲下题目意思
给定一个长度为\(n\)的序列\((1 \leq n \leq 100)\),
每次合并两个元素\(i,i+1\),即将\(i,i+1\)变为一个新的元素,权值为\(a[i]-a[i+1]\)(\(a\)为权值),
求在\(n-1\)次合并后剩下的元素的权值为\(t\)\((-10000 \leq t \leq 10000)\)的步骤(保证有解,spj)
解析
这题的减法有点不好弄啊...
但是,仔细想想,
如果我们将\(j\)和\(k\)合并成\((j-k)\),
再将\(i\)和\((j-k)\)合并,
就变成了\(i-j+k\),
所以,有些减法在运算时就已经消掉了!!
因此,我们只需要在每个数字前面填上加号或减号,使结果等于\(t\)就行了.
并且,注意到,第二个元素前只能是减号,因为前面已经不能消掉它的减号了.
然后,用DP递推地求符号就行了.
那么,怎么求呢?
我们可以设\(f[i][j]\)表示加到第\(i\)个数总和为\(j\)时第第\(i\)个数的符号,\(1\)为加,\(-1\)为减,
那么,在转移时,若\(f[i-1][j]\)不为零,即前面能够加到\(j\),
那么,\(f[i][j+a[i]]\)的符号就为正,\(f[i][j-a[i]]\)的符号就为负,
于是,最后从\(t\)倒推就行了,
不过注意,由于\(t\)可能为负,所以在求之前可以先加上一个值再算.
最后,注意输出方案,
首先我们可以记录下操作了几步,
由于我们是从前往后扫,所以每次用编号减掉操作次数就行了.
如果一个数的符号为正,那么它一定是被减掉后消掉的,
因此就输出它前面的标号减操作次数.
而对于剩下的数,很明显,我们对\(1\)一直操作就行了,
因此,若符号为负,输出\(1\)即可.
(讲的不清楚的地方自己算一下吧.)
上代码吧:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
inline int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
	return f*sum;
}
const int ret=10000;//加上一个数把t变成非负的
int n,m,sum;
int a[100001];
int f[101][20005];
int op[100001];
int main(){
	n=read();m=read();//m就是t,习惯而已qwq
	for(int i=1;i<=n;i++) a[i]=read(),sum+=a[i];
	sum=ret<<1;
	f[2][a[1]+ret-a[2]]=-1;f[1][a[1]+ret]=1;
	for(int i=3;i<=n;i++){
		for(int j=0;j<=sum;j++){
			if(!f[i-1][j]) continue;
			if(j+a[i]<=sum) f[i][j+a[i]]=1;
			if(j-a[i]>=0) f[i][j-a[i]]=-1;
		}
	}//DP
	sum=m+ret;
	for(int i=n;i>=2;i--){
		op[i]=f[i][sum];
		sum-=a[i]*op[i];
	}//求最后的符号
	int tot=0;
	for(int i=2;i<=n;i++) if(op[i]==1) printf("%d\n",i-1-tot),tot++;
	for(int i=2;i<=n;i++) if(op[i]==-1) puts("1");
	return 0;
}
题解 【POJ1722】 SUBTRACT的更多相关文章
- poj1722 SUBTRACT【线性DP】
		SUBTRACT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2037 Accepted: 901 Special ... 
- poj1722 SUBTRACT
		应该是基础的dp练手题 线性dp最主要的就是关于阶段的划分,这个题中我没想到的一点就是开状态的时候使用了前i个数能合成的数来记录 我自己的想法就是类似于区间dp这样的记录方法,这种方法确实开了很多冗余 ... 
- 常规DP专题练习
		POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ... 
- leetcode & lintcode 题解
		刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ... 
- IEEE Bigger系列题解
		Bigger系列题解 Bigger Python 坑点在于要高精度以及表达式求值,用java写可以很容易避免高精度问题 然后这道题就可以AC了 代码 import java.io.*; import ... 
- Codeforces Round #177 (Div. 2)  题解
		[前言]咦?如今怎么流行打CF了?于是当一帮大爷在执着的打div 1的时候,我偷偷的在刷div 2.至于怎么决定场次嘛.一般我报一个数字A,随便再拉一个人选一个数字B.然后開始做第A^B场.假设认为机 ... 
- 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践
		1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ... 
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
		我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ... 
- noip2016十连测题解
		以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ... 
随机推荐
- web应用安全
			一.三种坏人与servlet安全 网络攻击者 对应的servlet安全规范 假冒者 认证 非法升级者 授权 窃听者 机密性 数据完整性 认证可以防止“假冒者”攻击,授权可以防止“非法升级者”攻击, ... 
- Scala(一)安装
			一.环境信息 操作系统:cat /etc/redhat-release JDK: java -version 二.下载Scala安装包 网址:https://www.scala-lang.org/d ... 
- Python开发之JavaScript
			JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ... 
- 关于HA(2.102  -2.103  服务器排障)
			关于处理RHCA故障的报告: ,2.102 和 2.103 两台机器在重启之后拉不起来 原因是这两台服务比较怪 先要启动service rpcbind restart 然后再要起service nfs ... 
- HashMap的四种遍历方式
			package com.xt.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; impor ... 
- 《深入实践C++模板编程》之五——容器与迭代器
			1.容器的定义 容器:专门用于某种形式组织及存储数据的类称为“容器”. 2.容器与迭代器 迭代器:封装了对容器虚拟数据序列的操作并按约定提供统一界面以遍历容器内容的代理类即为迭代器. 举例理解 ... 
- QT  安卓 调用java类
			用以下方式即可调用java类中的方法 QAndroidJniObject activity = QtAndroid::androidActivity(); QAndroidJniObject Devi ... 
- 打包JavaFX11桌面应用程序
			打包JavaFX11桌面应用程序 这是JavaFX系列的第二弹,第一弹在这里 在第一弹中,我们使用的是OpenJDK8,但是OpenJDK8和Oracle Java JDK不一样,它没有内置JavaF ... 
- 不同格式的YUV 和 RGB互转
			YUV色彩空间: Y是亮度值,也就是说8位的灰度值即可组成一幅黑白图像,黑白电视机就是这样的. UV是色彩值,是给Y上色用的.U是Cb也就是RGB中的蓝色分量,V是Cr也就 ... 
- centos7安装配置NFS文件共享存储
			一,环境介绍 本实验使用了两台centos7虚拟机,其中 服务器:192.168.1.188 客户端:192.168.1.189 二,实验步骤 192.168.1.1 ... 
