//看题解写的 https://blog.csdn.net/sdfzyhx/article/details/51804748
#include<bits/stdc++.h>
using namespace std;
#define ll long long struct node{
int id,g;
bool operator<(const node a)const{
return g>a.g;
}
}g[];
int n,m,b[][],pre[][];
ll sum[],dp[][]; int main(){
freopen("cookies.in","r",stdin);
freopen("cookies.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&g[i].g),g[i].id=i;
sort(g+,g++n);//降序排列
for(int i=;i<=n;i++)sum[i]=sum[i-]+g[i].g;
memset(dp,0x3f,sizeof dp);
dp[][]=;
for(int i=;i<=n;i++)
for(int j=i;j<=m;j++){
dp[i][j]=dp[i][j-i];
for(int k=;k<=i;k++){
if(dp[i][j]>dp[i-k][j-k]+(sum[i]-sum[i-k])*(i-k)){//是保留原状态更优还是k-i区间都发一块饼干的状态更优
dp[i][j]=dp[i-k][j-k]+(sum[i]-sum[i-k])*(i-k);
b[i][j]=;//这个状态是发了一块饼干的
pre[i][j]=i-k;//i-k+1 到 i都只发了一块饼干
}
}
}
printf("%lld\n",dp[n][m]);
int p=n,t=m,ans[]={};
while(p){
if(b[p][t]){//只发了一块饼干的状态
int x=pre[p][t];
for(int i=x+;i<=p;i++)
ans[g[i].id]++;
t-=p-x;p=x;
}
else {//第一种状态转移,1-p所有阶梯都下降1
for(int i=;i<=p;i++)ans[g[i].id]++;
t-=p;
}
}
for(int i=;i<=n;i++) printf("%d ",ans[i]);
}

Gym100340 线性dp的更多相关文章

  1. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  2. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  3. hdu1712 线性dp

    //Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...

  4. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  5. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  6. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  7. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  8. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  9. 『最长等差数列 线性DP』

    最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...

随机推荐

  1. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  2. 获取天气预报API

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  3. DataSet in Machine Learning

    一.UCI Wine dataset:https://archive.ics.uci.edu/ml/datasets/Wine,包含178个样本,每个样本包含13个与酒的化学特性的特征,标签有1,2, ...

  4. jenkins多个slave遇到的坑

    jenkins配置如下: 在Jenkins上添加了两个节点(Slave Node),且为这两个节点设置了一个相同的标签"windows".创建了一个新Job – "tes ...

  5. 任意两点间的最短路问题(Floyd-Warshall算法)

    #define _CRT_SECURE_NO_WARNINGS /* 7 10 0 1 5 0 2 2 1 2 4 1 3 2 2 3 6 2 4 10 3 5 1 4 5 3 4 6 5 5 6 9 ...

  6. Linux 命令详解(三)./configure、make、make install 命令

    这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤 一.基本信息 1../configure 是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不 ...

  7. java元注解 @Documented注解使用

    @Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工 ...

  8. beef框架使用

    http://resources.infosecinstitute.com/beef-part-2/ http://resources.infosecinstitute.com/beef-part-1 ...

  9. android 不同Activity之间数据传递

    1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.a ...

  10. 2018-2019 前期任务(一):资料阅读&Python入门

    2018-2019 前期任务(一):资料阅读&Python入门 资料原文地址:Dumbcoin - An educational python implementation of a bitc ...