#include #include using namespace std; const int MAX=1000+10; int n,m,index,head,tail; int s[MAX],q[MAX]; int dp[MAX][2],cost[MAX],sum[MAX];//dp采用滚动数组 int GetY(int k1,int k2){ return dp[k2][index^1]-cost[k2]+sum[k2]*sum[k2]-(dp[k1][index^1]-cost[k1]+sum[k1]*sum[k1]); } int GetX(int k1,int k2){ return sum[k2]-sum[k1]; } int GetVal(int i,int k){ return dp[k][index^1]+cost[i]-cost[k]-sum[i]*sum[k]+sum[k]*sum[k]; } void solve(){ index=0; for(int i=1;i<=n;i++) dp[i][index]=cost[i]; for(int j=1;j<=m;j++){//分成j段,j作为第一层循环才用滚动数组 index=index^1; head=tail=0; q[tail++]=0; for(int i=1;i<=n;i++){ while(head+1