求贤若渴,虚心前行。
今天为大家整理一道动态规划的经典题目——书的抄写,是一道经典的二维线性dp问题,一起看一下吧。
9 3
1 2 3 4 5 6 7 8 9
1 5
6 7
8 9
题解代码:
#include<iostream>
#include<cstring>using namespace std;int m,k,a[505],dp[505][505],sum[505],path[505][505]; void print(int i,int j){ if(i==0) return ; print(i-1,path[i][j]); printf("%d %d\n",path[i][j]+1,j);}int main(){ scanf("%d%d",&m,&k); for(int i=1;i<=m;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } memset(dp,0x3f,sizeof(dp)); for(int i=1;i<=m-k+1;i++){ dp[1][i]=sum[i]; } for(int i=2;i<=k;i++){ for(int j=i;j<=m-k+i;j++){ for(int k=i-1;k<j;k++){ if(max(dp[i-1][k],sum[j]-sum[k])<dp[i][j]){ dp[i][j]=max(dp[i-1][k],sum[j]-sum[k]); path[i][j]=k; } } } } print(k,m); // printf("%d\n",dp[k][m]); return 0;} 原文:https://www.cnblogs.com/cxs070998/p/11370021.html