出现这一错误,原因还是在于没有严格按照dp的步骤来,忽略了填写dp数组中一个重要的前提(步骤4)
dp步骤:
1.确定状态,并用状态表示我们的求解目标
2.确定状态转移方程
3.初始化dp数组(填写边界状态,或者特殊的状态)
4.确定填写dp数组的顺序(保证填写每一个状态的时候,所需要的状态都已经求出来了)(其实我们可以从转移方程看出来,如果需要用到后一个状态,那我们得倒着枚举)
5.循环填写dp数组
错误纠正
我们按照第一维和第二维均从小到大遍历的方式填写dp[][]是错误的,
由状态转移方程dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1]);(k>=i)可知
当我们填写第i行的时候,我们会用到第i行下面的状态,而我们的填表方式是从上往下,从左往右的,
所有当我们填写第i行的时候,i行以下的状态还没有求出来,所以第一维从小到大枚举是不行的
我们应该第一维从后往前枚举
再看第二维,我们填写第j列的时候会用到第k列的状态,而第k列是在第k列前面的,
所以第二维应该从前往后枚举
石子合并题目:https://www.acwing.com/problem/content/284/