合唱团
先读题★
状态表示 dp[i][j]表示第 i 个人为结尾的队列中又 j 个人的最大值,☆(状态表示是看别人的)
遇到的逻辑问题:
1. 怎么映射?映射到arr数组里,可以-1也可以不加。因为是自己输入,在最开始添加一个就行,且也多开一个
2. 可以不多开dp和数组,刚开是想的时候还是参考经验,包括多开和初始化(其实就是逻辑没有理清楚)因为第一次初始化的位置没有借助无效的位置(没有初始化过的位置),主要是慌啊,有点害怕和紧张,想快点先写一点代码
3. 比如说第i号位置的j个人,那么就去第m为结尾的 j - 1 一个里找一个最大值,
问题1: i - d <= m <= i - 1; m会越界,到这我就打算要扩容dp和数组了,因为i - 1对于第0个位置;其二 i - d,看例子成负数了,我第一时间想到的是修正成1(因为dp扩容)
问题2:我发现最大值和最小值数据多了,监视里不对?因为是乘法,肯定dp里不能是0,对吧,不然一直是0了;判断代码肯定是这样的-> max(maxval[i][j], max(maxval[x][j - 1] * arr[i], minval[x][j - 1] * arr[i])); 如果第一个值是负数,不就是1了吗?对于minval来说,第一个值是正数,也会改成错误的1,那么怎么办啊?画图发现dp[i][1](指的是maxval,minval)的位置就是arr[i],所以添加if(j == 1) 开始初始化
问题3:还是不对第一次的这样值-> maxval[i][j] 总是会影响我判断,但是这个肯定要,因为有好多个maxval[i][j] 里找一个最大的;然后想到,不如给他初始化了,直接从i位置向前连续去j个(d起码要是1吧),这回总该对了吧
问题