题目:
https://jzoj.net/junior/#contest/home/1313
T1:这道题其实就是noip2000提高组的简单版。因这道题只需转化为-2进制,所以我们可以将输入的n一直 div -2即可,然后当n为负数的时候,会有一点变数。例:-15÷-2=8...1,而计算机中根据div的性质是7...-1,所以我们当n mod -2<>0的时候我们就要把得到的n div -2加1.然后每次得到的n都需记录一个abs(n mod 2),最后输出即可。
T2:这道题很明显的动态规划题目。其意就是在一个序列里,每次可以取首尾两端,当取了任意一端后,又会产生新的首尾,于是又在新的首尾里继续取首尾两端,最后求一个取数的顺序,来保证求得的答案最大,答案的计算方式是
答案+当前取的数的数值*当前取了几个数。
例:
5
1 3 1 5 2
取数顺序为1,5,2,3,4,这样答案就是1*1+2*2+3*3+4*1+5*5=43。
做这道题目最容易想到的就是贪心,也就是对当前首尾两端取一个min,然后用这个min来记录。
但很容易举出反例:
6
6 7 8 1 2 9
贪心策略的顺序是:6,7,8,1,2,9.答案=112
而正确的顺序应是:9,2,1,6,7,8.答案=123
可见,贪心有时候可能为了一点点小利益而丢失了大利益,所以贪心往往是错误的,正确的解法应该是动态规划。
那么我们需先确定这是一个动态规划的题目。
我们知道这道题符合最优子结构,也就是问题的最优解可以划分为它的子问题的最优解。其次因为1~n的顺序不能改变,所以,又满足了无后效性(不管1~i你怎么选,都不可能对其他的数产生影响)
确定是动规之后,我们就可以划分阶段了,我一开始想到的就是把他按区间划分,也就是分为一个区间一个区间,用f[i,j]表示i~j这个区间能取到的最优值。
很明显,对于i~j这个区间,只有2种情况。
一、先取i。
二、先取j。
第一种情况:
a[i]+f[i+1,j]+sum[i+1,j],加上sum[i+1,j]是因为一个选的是i,后面选的数都会在原来的最优情况下从2乘起,所以加一个(i+1...j)的数的和。
第二种情况与第一种情况相仿(自己解决)
最后输出f[1,n]即可。