2016.6.18纪中模拟赛

来源:互联网 发布:盛势网络剧07bilibili 编辑:程序博客网 时间:2024/05/18 20:13

题目:

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]即可。

1 0
原创粉丝点击