先讲下题目意思

给定一个长度为\(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的更多相关文章

  1. poj1722 SUBTRACT【线性DP】

    SUBTRACT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2037   Accepted: 901   Special ...

  2. poj1722 SUBTRACT

    应该是基础的dp练手题 线性dp最主要的就是关于阶段的划分,这个题中我没想到的一点就是开状态的时候使用了前i个数能合成的数来记录 我自己的想法就是类似于区间dp这样的记录方法,这种方法确实开了很多冗余 ...

  3. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  4. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

  5. IEEE Bigger系列题解

    Bigger系列题解 Bigger Python 坑点在于要高精度以及表达式求值,用java写可以很容易避免高精度问题 然后这道题就可以AC了 代码 import java.io.*; import ...

  6. Codeforces Round #177 (Div. 2) 题解

    [前言]咦?如今怎么流行打CF了?于是当一帮大爷在执着的打div 1的时候,我偷偷的在刷div 2.至于怎么决定场次嘛.一般我报一个数字A,随便再拉一个人选一个数字B.然后開始做第A^B场.假设认为机 ...

  7. 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践

    1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

随机推荐

  1. linux yum 使用epel源

    由于CentOS6的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题. ...

  2. 洛谷P2622 关灯问题II (二进制枚举+bfs

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  3. 异或运算符(^)、与运算符(&)、或运算符(|)、反运算符(~)、右移运算符(>>)、无符号右移运算符(>>>)

    目录 异或(^).异或和 的性质及应用总结 异或的含义 异或的性质:满足交换律和结合律 异或的应用 按位 与运算符(&) 按位 或运算符(|) 取 反运算符(~) 右移运算符(>> ...

  4. Python编程之注释

    一.注释 当你把变量理解透了,你就已经进入了编程的世界.随着学习的深入,用不了多久,你就可以写复杂的上千甚至上万行的代码啦,有些代码你花了很久写出来,过了些天再回去看,发现竟然看不懂了,这太正常了. ...

  5. OVS+Docker

    两台机器操作一样就是IP不同但是设置都是相同的: A机器:192.168.71.142 docker0:172.17.42.1 B机器:192.168.71.136 docker0:172.17.43 ...

  6. paramiko-ssh-秘钥认证实例

    import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa.txt') #创建ssh对象 ssh =para ...

  7. Java 常提到的自然序(Natural Ordering)

    Natural Ordering常在容器中被提到,和迭代器一起出现. 在Comparable接口的API规范中找到了描述. (https://docs.oracle.com/javase/8/docs ...

  8. Neo4j Cypher语法(一)

    目录 Cypher手册详解 1 背景 2 唯一性 3 语法 3.1 命名规则 3.2 表达式 3.3 变量与保留关键字 3.4 参数 3.5 操作符 3.6 模式 3.7 列表 Cypher手册详解 ...

  9. 豆瓣网post 爬取带验证码

    # -*- coding: utf- -*- import scrapy import requests from ..bao.jiema import get_number fromdata = { ...

  10. GitHub使用--01

    1.Git下载与安装 Git网站下载地址https://git-scm.com/downloads 2.本地Git使用 在存储代码仓库的文件夹下右键 git bash here 初始化仓库 git i ...