问题标题: 酷町堂:1290 糖果盒(candybox)怎么做?

0
1

0
已采纳
贾文卓
贾文卓
高级光能
高级光能

动态规划。
先说说0怎么办,直接将其变成很小的一个负数就行了(就不信你还要取这个数)。
思路:设f[i][j]表示从第i列到第j列之间的子矩阵中的最大值。
状态转移方程:f1[i][j]=max(f1[i][j],0)+sum[k][j]-sum[k][i-1]
f[i][j]是f1[i][j]在不断更新的过程中的最大值。
边界:f1[i][j]初始值为0。
解:max{f数组},即f数组中的最大值。
那么状态转移方程为什么这么写呢?我们要涉及另外一题。
最大子段和问题:
给定一个长度为n的序列,求其中的所有子段和的最大值(子段即序列中连续的一段)。
这题同样是动态规划。我们设f[i]表示以第i个数结尾的子段中的最大和。
状态转移方程:f[i]=max(f[i-1],0)+a[i]
形象的说,就是判断上一个是“正能量”(正数)还是负能量(非正数)。如果是正能量的话就加上,否则就抛弃。但是由于以i结尾,所以a[i]是必须加上的。
边界:f[0]=0
解:max{f数组}
这样看来,上面的第一个状态转移方程就不难理解了。
注:1.sum[i][j]表示第i行前j个数的和。
2.k枚举每一行,从1到总行数。
3.第i行第j个数到第k个数的和=sum[i][k]-sum[i][j-1]

0
0
刘煜熙
刘煜熙
修练者
修练者

可参考2994,只需要判断选中的矩阵中有没有0

0
我要回答