思考:(这道题是抄kuangbin聚聚的),这个题给了2种状态,一个是段数,一个是数值,我感觉关于dp来说,最难定义的就是状态(可能我还没有入门)感觉定义了好的状态,在推到状态转移方程的时候才会更容易推出(虎爷说过一般题目上说到几个状态就把dp数组定义为几维),对于一道dp题应该先相处以个可行的方案,然后才考虑是否进行降维,在思考怎么进行优化,而不是直接就思考在复杂度允许之内的东西
下面是ac代码:
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+7; int a[maxn]; int dp[maxn],mk[maxn]; int main() { int m,n; while(~scanf("%d%d",&m,&n)){ for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); memset(mk,0,sizeof(mk)); dp[0]=mk[0]=0; int maxe; for(int i=1;i<=m;i++){ maxe=-0x3f3f3f3f; for(int j=i;j<=n;j++){ dp[j]=max(dp[j-1],mk[j-1])+a[j]; mk[j-1]=maxe; maxe=max(maxe,dp[j]); } } printf("%d\n",maxe); } return 0; }