dp——洛谷P1281 书的复制

来源:互联网 发布:淘宝叫人拍注意事项 编辑:程序博客网 时间:2024/06/06 03:17

https://www.luogu.org/problem/show?pid=1281#sub
本来以为水题,后来炸了;
dp方程这个直接想总不难把;
毫无优化的暴力转移;
但是最后输出方案的时候,不可以按照dp的方案输出的;
因为dp它的方案是让子节点数值最优;
这样的方案是是不可以保证总的方案最优的;
所以要最后贪心输出答案;
就是后面的人经可能的取;

#include<bits/stdc++.h>#define Ll long longusing namespace std;const int N=505;int f[N][N],a[N];int n,m;void out(int m,int n,int z){    if(!m)return;    int k=0;    while(k<n&&a[n]-a[n-k-1]<=z)k++;    out(m-1,n-k,z);    printf("%d %d\n",n-k+1,n);}int main(){    memset(f,63,sizeof f);    f[0][0]=0;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]+=a[i-1];    for(int i=1;i<=m;i++)        for(int j=1;j<=n;j++)            for(int k=1;j-k>=i-1;k++)                f[i][j]=min(f[i][j],max(f[i-1][j-k],a[j]-a[j-k]));      out(m,n,f[m][n]);}