4953: [Wf2017]Posterize

Time Limit: 4 Sec  Memory Limit: 1024 MB
Submit: 102  Solved: 46
[Submit][Status][Discuss]

Description

数字图像的像素可以用三个在0到255之间的整数表示,它们分别表示红色、绿色和蓝色的强度。为了压缩图片或是为了产生艺术效果,许多图像编辑工具收录了如下所述的"色调分离"操作。每个颜色通道会分别考虑,本题只考虑红色通道的情况。不同于在红色通道使用0到255之间全部的整数,一张色调分离后的图片只会使用这些数字里至多 k 种整数。每个像素原来的红色强度会被替换成最相近的可用强度。图像编辑工具会选择k个整数来最小化替换过程引起的平方误差之和。假设原图有n个像素,它们的红色取值是r1,···,rn,而 k 种可用整数为v1,···,vk ,那么平方误差之和被定义为
你的任务是计算可以实现的最小平方误差之和,参数k和图片的红色强度会给出。

Input

第一行包含两个整数d(1≤d≤256)和k(1≤k≤d)
分别表示原图中不同的红色强度有多少种,色调分离后可以使用的红色强度有多少种。
接下来d行描述了每种红色强度在原图中占据的像素点数量。
每行包含两个整数r(0≤r≤255)和p(1≤p≤226)
这里r是一种红色强度的取值,而p是这种取值对应的像素点数量。这d行信息按照红色强度取值升序给出。

Output

输出最优的 k 种可选取值对应的平方误差之和。

Sample Input

2 1
50 20000
150 10000
2 2
50 20000
150 10000
4 2
0 30000
25 30000
50 30000
255 30000

Sample Output

66670000
0
37500000

dp[x][y]表示前x个红光强度选了y个整数且第y个整数为x的最优解,有

其中si表示红光强度为i的像素点有si个,pi表示红光强度,后面两个求和公式把平方和拆开就可以求前缀和了

初始化dp[i][1] (1<=i<=256)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
LL a[257], sa[257], sq[257][257], sb[257][257], dp[257][257];
int main(void)
{LL n, m, i, j, k, x, y, ans;scanf("%lld%lld", &n, &m);for(i=1;i<=n;i++){scanf("%lld%lld", &x, &y);a[x+1] += y;}for(i=1;i<=256;i++)sa[i] = sa[i-1]+i*i*a[i];for(i=1;i<=256;i++){for(j=1;j<=256;j++){sb[i][j] = sb[i][j-1]+i*i*a[j];sq[i][j] = sq[i][j-1]+2*i*j*a[j];}}memset(dp, 62, sizeof(dp));for(i=1;i<=256;i++)dp[i][1] = sa[256]+sb[i][256]-sq[i][256];for(k=1;k<=m;k++){for(i=k;i<=256;i++){for(j=k-1;j<=i-1;j++){x = (i+j)/2;dp[i][k] = min(dp[i][k], dp[j][k-1]+sa[256]+sb[i][256]-sq[i][256]-sa[x]-sb[i][x]+sq[i][x]-(sa[256]+sb[j][256]-sq[j][256]-sa[x]-sb[j][x]+sq[j][x]));}}}ans = -1;for(i=m;i<=256;i++){if(ans==-1)ans = dp[i][m];elseans = min(ans, dp[i][m]);}printf("%lld\n", ans);return 0;
}

bzoj 4953: [Wf2017]Posterize(DP)相关推荐

  1. bzoj 1237: [SCOI2008]配对(DP)

    1237: [SCOI2008]配对 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1602  Solved: 627 [Submit][Statu ...

  2. bzoj 1133: [POI2009]Kon(DP)

    1133: [POI2009]Kon Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 457  Solved: 166 [Submit][Status ...

  3. bzoj 4247: 挂饰(DP)

    4247: 挂饰 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1230  Solved: 497 [Submit][Status][Discuss ...

  4. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  5. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  6. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  7. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  8. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  9. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

最新文章

  1. 自动化 专业 与行业
  2. R语言If、Else条件语句实战
  3. Web布局连载——两栏固定布局(五)
  4. 【Linux】一步一步学Linux——mtools命令(244)
  5. 70.Climbing Stairs
  6. 淮安掼蛋网页版-源码头文件总结
  7. python中pip不可用_python – pip无法确认SSL证书:SSL模块不可用
  8. 3.14 以子类取代类型码
  9. windows2000/xp运行命令全集
  10. JPA的主键生成策略
  11. 工作中 linux 常用命令:vi、cp、mv、rm、kill、curl、tail
  12. oracle no expand,NO_EXPAND Hint性能优化一例
  13. L1-017 到底有多二 (15 分) — 团体程序设计天梯赛
  14. 大快DKM大数据基础管理平台的监控功能剖析
  15. 阿里巴巴对外开源液冷数据中心技术
  16. dota2服务器切换账号,畅爽竞技必看 DOTA2服务器选择指南
  17. 如何解决遇到的The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone
  18. arcgis标注牵引线_ArcEngine设置有牵引线的标注
  19. springboot配置mysql数据源_SpringBoot+mysql配置两个数据源
  20. dataframe横向和纵向拼接

热门文章

  1. MediaMuxer的使用
  2. 文档权限服务器上,服务器上的权限
  3. QQ资料清空php源码,[php源码][QQ玫瑰小镇]一键收铲种,php网页版
  4. 新手小白python数据清洗代码_5天10分钟,学会数据清洗!(Python)
  5. 输入三角形的三c语言程序,输入三角形的三边 a,b,c,计算三角形的面积的公式是 C++...
  6. android toast 自定义时间,android自定义Toast设定显示时间
  7. matlab教程曲线拟合,matlab 曲线拟合
  8. 服务器设置站点网站为本地IP
  9. linux 镜像 多 网络,Linux内核实现多路镜像流量聚合和复制的方法
  10. Java调用db2cmd命令导出数据