首页 > 编程知识 正文

subtract词根词缀,subtract from是什么意思

时间:2023-05-03 11:06:42 阅读:136192 作者:102

子跟踪

一个长度为n序列((a_I ) ) ) ),并定义了使用) a_I-a_{I1} )的操作,而不是) ) a_I ) ) )。

解很明显,现在的模型是不能递归的。 为什么这么说呢,因为数组长度发生了变化。 因此,具有以下性质

性质1

假设序列是((a,b,c ) ) ),操作大致如下

ABCA-BCA-B-CA B-CA-B-C于是我们发现,操作就是在数组的各个数字前加上-符号。 不难看出,第一个数字的前面是必然的,第二个数字是必然的。 问题是后面的,-不知道序列是否合法,可以推测它是合法的,但暂时不能证明。

性质2

如果将替代后的数用括号看作一个整体

ABCA(B-C ) (A-) B-C ) )于是,我们发现问题转换成只有第一个数字前面,后面都是-。 加括号,保证每个数都是扩展的(即碰到括号边界)。 另一方面,我们的加减排列只是去掉了括号。 这个性质很容易理解。

性质3

性质1尚存疑问。 那是怎么回事? -排列才是合法的。 既然不知道,推测无论如何都是合法的。 首先一个加减序列是(a-b-c-d ) )。 也就是说,第一个,剩下的全部是-。 我们一定可以对第一个数继续操作使其合法。 对于两个数一定的第二个数的符号必须是-。

因此,对于一个,-序列,如果遇到了,我们一定要想办法成为-。 而且,要成为-,必须做到前面有-。 于是,对于一个连续,我们可以进行这样的操作,注意到第二个数一定是一个,无论如何后面的数一定是-。 因此,后面无论-的情况如何,总是合法的操作序列

而且,他还告诉我,成为操作序列的方法,如果是正面的话就是负面的。

我发现有这三个性质,数字很小。 现在的问题是,那个数字会不会被选中——让最后的结果正好成为t。 于是,可以暴力压缩t进行保存。 因为不求最优性问题,所以递归数组可以顺便保存计划。 1表示在此选出,-1表示在此选出。 因此,(f(I ) ) j )最初I的个数的权重正好是j的I

(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 # defineilinline # defineriregister # define zero 10000 usingnamespacestd; int a[101]、dp[101][20010]、ans[101]; voidgetans(int,int ); int main () { int n,t; scanf('%d%d ),n,t ); for(intI ) 1; i=n; I ) scanf('%d ',a[i]; dp[1][zero a[1]]=1,dp[2][zero a[1]-a[2]]=-1; for(intI )2),j; in; I ) for ) j=0; j=20000; j ) if(DP[I] ) dp[i 1][j a[i 1]]=1,dp[i 1][j-a[i 1]]=-1; Getans(n,t zero ); inttot(2; for(intI ) 2; i=n; I ) ) while(ans[I1]==1I=n ) I,printf('%dn ',tot ); tot; (}--tot; wile(--tot ) puts ) '1); 返回0; }voidgetans(inta,int b ) ) if (! a )返回; ans[a]=dp[a][b]; Getans(a-1,b-dp[a][b]*:a[a] ); }转载于:https://www.cn blogs.com/a1b 3c 7d9/p/10995805.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。