先说尼克的任务吧,总体上不难,晋级+大概,用一个滚动数组就可以很方便的解决掉题(二维数组不仅麻烦,而且写的多,不好写,容易出错)
这道题特点有两个,1要判断一下当前时间的任务的个数,如果没有任务,就ans++,如果有的话,就枚举当前这个点的任务个数,然后更新状态。
2就是要逆序推,尽管滚动数组本来就要逆序推,这也是为什么我说滚动数组比较方便的原因,如果使用二维数组的话,或者更高维,就要正向推,(貌似也不能用二维,因为任务个数不是单独的,而是与时间有关的),但是这道题比较特殊,这个当前时间任务选择的问题与已经过去的时间无关,而与接下来要到来的时间有关,所以要先推出接下来要做的任务,再来更新当前的任务。
然后是多米诺骨牌,难度也是到了提高/省选,反正我啥感觉都没有(因为都不会做),这个状态转移方程也是看了很多东西才体会到的。
看到这个题,首先可以确定是一个状态搜索,而状态就是当先情况下,上面的点的和 和 下面的点的和,当然还有就是当前翻没翻过,和当前的个数,
乍一想,我的天,4维?,但是再一想翻没翻过其实和上下点的个数是有关系的,然后变成3维,再一观察发现,当前上面点的和与下面点的和的总和是相等的,于是变成2维,dp求解就可以啦
核心的状态转移方程:dp[i][j]为第i个数上面总和是j的情况下的最小翻转次数
if (j >= a[i])dp[i][j] = min(dp[i - 1][j - a[i]], dp[i][j]);
if (j >= b[i])dp[i][j] = min(dp[i - 1][j - b[i]]+1, dp[i][j]);
最后要记得找到的只是状态,自己最后要再枚举一下,看看那个状态下两个差最小,输出就好了