SUBTRACT

给出一个长度为n序列\(\{a_i\}\),定义一个操作,记做\(con(a,i)\),意思是用\(a_i-a_{i+1}\)替代\(a_i,a_{i+1}\),显然最后一个数字不能进行这样的操作,序列也最多只能进行n-1次操作,而且最后序列会剩下一个数字,求它刚好为t的操作方案,\(1 <= N <= 100,1 <= ai <= 100\)。

显然,当前的模型是不能进行递推的,因为序列长度在改变,于是有以下性质


性质1

假设序列为\(\{a,b,c\}\),进行操作大概如此

a b c
a-b c
a-b-c a b c
a b-c
a-b+c

于是我们发现所谓的操作,也就是给序列的各个数字前添上+,-号,不难发现第一个数字前必然是+,第2个数字必然是-,问题是不知道后面的+,-序列是否合法,不妨猜测它是合法的,但是暂时没办法证明。

性质2

如果把替代后的数用括号看成一个整体

a b c
a (b-c)
(a-(b-c))

于是发现问题转化为刚开始序列只有第一个数字前面为+,后面的全为-,要添上括号,并保证每一个数都被扩到(也就是碰到括号边界),而我们的加减序列,只是被去掉了括号,这条性质是便于理解。

性质3

性质1留下一个疑问,就是怎样的+,-序列才是合法的,既然不知道,猜测无论如何都是合法的,首先能够发现的是一个加减序列为\(a-b-c-d\),即第一个+,后面全是-,我们一定能够不停地对第一个数进行操作使之合法,对于只有两个数一定第二个数符号为-才是让这两个数被加上括号,因此关键在+

于是对于一个+,-序列而言,遇到+,我们肯定要想办法变为-,而要使之为-,必然前面要有-,让之变为-,于是对于一段连续的+,我们都可以进行这样的操作,而注意到第二个数一定有一个-,因此无论如何后面有+的数总会有-,因此后面无论+-情况如何,总能成为一个合法的操作序列。

而且也告诉我们,成为操作序列的办法是,遇加变减即可。


有了这三条性质,我们注意到数字很小,现在问题是该数字是选+还是-,让之最后结果正好为t,于是可以暴力压维保存t,因为并没有求最优性问题,递推数组可以顺便保存方案,1表示这里选+,-1表示这里选-,因此设\(f[i][j]\)表示前i个数权值正好为j的i的符号(0表示这是非法状态),用顺转移有

\(if(f[i][j])\)

\[f[i+1][j+a_i]=1,f[i+1][f-a_i]=-1
\]

边界:\(f[1][a_1]=1,f[2][a_2]=-1\)

答案:\(f[n][t]\)

参考代码:

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define zero 10000
using namespace std;
int a[101],dp[101][20010],
ans[101];
void getans(int,int);
int main(){
int n,t;scanf("%d%d",&n,&t);
for(int i(1);i<=n;++i)scanf("%d",&a[i]);
dp[1][zero+a[1]]=1,dp[2][zero+a[1]-a[2]]=-1;
for(int i(2),j;i<n;++i)
for(j=0;j<=20000;++j)
if(dp[i][j])
dp[i+1][j+a[i+1]]=1,
dp[i+1][j-a[i+1]]=-1;
getans(n,t+zero);int tot(2);
for(int i(2);i<=n;++i){
while(ans[i+1]==1&&i<=n)++i,printf("%d\n",tot);++tot;
}--tot;while(--tot)puts("1");
return 0;
}
void getans(int a,int b){
if(!a)return;ans[a]=dp[a][b];
getans(a-1,b-dp[a][b]*::a[a]);
}

SUBTRACT的更多相关文章

  1. RDD常用方法之subtract&intersection&cartesian

    subtract Return an RDD with the elements from `this` that are not in `other` .     def subtract(othe ...

  2. [CareerCup] 7.4 Implement Multiply Subtract and Divide 实现乘法减法和除法

    7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...

  3. add, subtract, multiply, divide

    加.减.乘.除:add, subtract, multiply, divide

  4. MongoDB比较两列大小 使用$subtract函数

    是找出整个表 a大于b的总数量,要怎么操作数据库呢,那就要用到$subtract函数 MongoDB比较两列大小 使用$subtract函数, // MongoDB 比较两列大小求出 啊>b 的 ...

  5. poj1722 SUBTRACT【线性DP】

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

  6. Spark 学习笔记之 union/intersection/subtract

    union/intersection/subtract: import org.apache.spark.SparkContext import org.apache.spark.rdd.RDD im ...

  7. C# DateTime Subtract

    DateTime start = DateTime.Now.AddDays(-20); DateTime end = DateTime.Now; TimeSpan ts = end.Subtract( ...

  8. 【java】Java.math.BigDecimal.subtract()方法实例

    java.math.BigDecimal.subtract(BigDecimal subtrahend) 返回一个BigDecimal,其值为 (this - subtrahend), 精度为 max ...

  9. deep_learning_Function_tf.add()、tf.subtract()、tf.multiply()、tf.div()

    tf.add().tf.subtract().tf.multiply().tf.div()函数介绍和示例 1. tf.add() 释义:加法操作 示例: x = tf.constant(2, dtyp ...

随机推荐

  1. Quartz CronTrigger 整配置说明

    Quartz cron 表达式的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级.  Quartz用cron 表达式存放执行计划,引用了cron表达式的CronTrigger在计 ...

  2. win10命令行kill进程

    1. 查:netstat -ano | findstr "8080" 2. 杀:taskkill -PID 8082 -F

  3. bootstrap-自带插件(完成的小功能)

    模态框 务必将模态框的HTML代码放在文档的最高层级内(也就是说,尽量作为 body 标签的直接子元素),以避免其他组件影响模态框的展现和/或功能. <!-- 触发模态框的按钮 --> & ...

  4. Thread相关API

    参考书籍:<java多线程核心编程技术> Thread相关API,这些API可以改变线程对象的状态 新建一个线程对象,调用start方法后,系统会为该线程分配CPU资源,此时该线程处于可运 ...

  5. uptime - 告知系统运行了多久时间

    SYNOPSIS(总览) uptime uptime [-V] DESCRIPTION(描述) uptime 给出下列信息的一行显示. 当前时间, 系统运行了多久时间, 当前登陆的用户有多少, 以及前 ...

  6. struts2类型转换1

    概述 从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串. HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服务器端, 必须把 ...

  7. wchar用wcout输出正常cout是?

  8. 了解linux web的监听工具

    zabbix cacti Nagios 本想安装的,但是安装需要一个 空的服务器,因为服务器已经有安装 LAMP,故没有去了解 尝试了 cacti ,因为本地环境版本问题,只能使用0.8.8a版本,并 ...

  9. 实时监听input输入情况

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. php获取数组中指定值的下标

    public function find_by_foreach($array,$find)//$array数组 $find需要查找的值 { foreach ($array as $key => ...