acdream 1222 Quantization Problem [dp]
称号:acdream 1222 Quantization Problem
题意:给出一个序列 a ,然后给出一个 n * m 的矩阵,让你从这个矩阵中选出一个序列k,使得sum(abs(ki - ai))尽可能的小,首先第一个数仅仅能在矩阵的第一行选第 x 个。然后以后每一个在第 x%n 行选,依次选出最小就可以。
每一个点能够选多次、
分析:这个题目难度在于题意,题意读懂了就简单了。
非常明显的一个dp题目,我们定义状态:dp 【i】【j】 :选第 i 个数 在第 j 列的最小和
则转移方程:dp 【i】【j】 = dp [ i - 1 ] [ k ] + abs ( a [ i ] - mp [ k % s ] [ j ] ) ; k是枚举的前一次在第k行选
然后用一个pre数组保存一下路径就ok
AC代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1200;
const int M = 130;
int dp[N][M];
int mp[M][M];
int pre[N][M];
int a[N];
int main()
{
//freopen("Input.txt","r",stdin);
int n;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
int s,c;
scanf("%d%d",&s,&c);
for(int i=0; i<s; i++)
{
for(int j=0; j<c; j++)
scanf("%d",&mp[i][j]);
}
memset(dp,inf,sizeof(dp));
for(int i=0; i<c; i++)
{
int ff = abs(a[0]-mp[0][i]);
dp[0][i]=min(dp[0][i],ff);
//printf("%d ",dp[0][i]);
}
memset(pre,0,sizeof(pre));
for(int i=1; i<n; i++)
{
for(int j=0; j<c; j++)
{
for(int k=0; k<c; k++)
{
int ff = dp[i-1][k] + abs(a[i]-mp[k%s][j]); //枚举在全部行取。
if(ff<dp[i][j])
{
dp[i][j]=ff;
pre[i][j]=k;
}
}
//printf("%d ",dp[i][j]);
}
//printf("\n");
}
int ans = inf, rec;
for(int i = 0; i < c; i++)
{
if(dp[n-1][i] < ans)
{
ans = dp[n-1][i];
rec = i;
}
}
printf("%d\n", ans);
vector<int> res;
int i = n-1;
while(i != -1)
{
res.push_back(rec);
rec = pre[i--][rec];
}
for(int i = res.size() - 1; 0 <= i; --i)
{
printf("%d%c",res[i],i==0? '\n':' ');
}
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
acdream 1222 Quantization Problem [dp]的更多相关文章
- SGU 205. Quantization Problem
205. Quantization Problem time limit per test: 0.25 sec. memory limit per test: 65536 KB input: stan ...
- UVA11069 - A Graph Problem(DP)
UVA11069 - A Graph Problem(DP) 题目链接 题目大意:给你n个点.要你找出有多少子串符合要求.首先没有连续的数字,其次不能再往里面加入不论什么的数字而不违反第一条要求. 解 ...
- D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) )
D. Easy Problem dp(有衔接关系的dp(类似于分类讨论) ) 题意 给出一个串 给出删除每一个字符的代价问使得串里面没有hard的子序列需要付出的最小代价(子序列不连续也行) 思路 要 ...
- Codeforces 706 C. Hard problem (dp)
题目链接:http://codeforces.com/problemset/problem/706/C 给你n个字符串,可以反转任意一个字符串,反转每个字符串都有其对应的花费ci. 经过操作后是否能满 ...
- Codeforces Gym 100342D Problem D. Dinner Problem Dp+高精度
Problem D. Dinner ProblemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1003 ...
- bzoj 1222: [HNOI2001]产品加工 dp
1222: [HNOI2001]产品加工 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 381 Solved: 218[Submit][Status ...
- hdu 5464 Clarke and problem dp
Clarke and problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...
- uva 10401 Injured Queen Problem(dp)
题目链接:10401 - Injured Queen Problem 题目大意:给出一个字符串,要求在n * n(n为字符串的长度)的棋盘上摆放n个受伤的皇后,受伤的皇后只能攻击到同一列和它周围8个格 ...
- Codeforces 1096D - Easy Problem - [DP]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...
随机推荐
- python对web服务器做压力测试并做出图形直观显示
压力测试有很多工具啊.apache的,还有jmeter, 还有loadrunner,都比较常用. 其实你自己用python写的,也足够用. 压力测试过程中要统计时间. 比如每秒的并发数,每秒的最大响应 ...
- Oracle多表的简单查询
Oracle多表的简单查询 .多表查询 多表查询是指基于两个和两个以上的表或是视图的查询. 问题:显示雇员名,雇员工资及所在部门的名字[笛卡尔集]? select t.ename,t.sal,t1.d ...
- DOM querySelector选择器
原生的强大DOM选择器querySelector 在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并 ...
- Android开发之大位图二次採样压缩处理(源码分享)
图片有各种形状和大小.在很多情况下这些图片是远远大于我们的用户界面(UI)且占领着极大的内存空间,假设我们不正确位图进行压缩处理,我们的程序会发生内存泄露的错误. MainActivity的代码 pa ...
- 技术回归01-Windows内存分配工具
很久没有写技术方面的东西了,这半年主要是在学习别人的东西,对自己提高比较大,算是一次技术回笼吧,这次学习之旅目的是结束技术方面的专注,开始向应用方面找突破口,也就是完成技术积累或者为技术的积累做坚实的 ...
- 九度OnlineJudge之1018:统计同成绩学生人数
题目描述: 读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入: 测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的 ...
- python与其它语言进行比較
近期python语言貌似比較火, 今天闲来无事,简单的看了下,算是个入门吧.一门语言之所以值得这么多人去学,必然有它的独到之处,以下我们就用python和其它语言做个比較. Pythond VS C# ...
- MySQL字符集编码
MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...
- linux命名管道通信过程
前一个道,这节学习命名管道. 二命名管道 无名管道仅仅能用来在父子进程或兄弟进程之间进行通信,这就给没有亲缘关系的进程之间数据的交换带来了麻烦.解决问题就是本节要学习的还有一种管道通信:命名管道. 命 ...
- windows程序员进阶系列:《软件调试》之Win32堆
win32堆及内部结构 Windows在创建一个新的进程时会为该进程创建第一个堆,被称为进程的默认堆.默认堆的句柄会被保存在进程环境块_PEB的ProcessHeap字段中. 要获得_PEB的地址, ...