传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=126

好题啊好题,一开始就输给了这道题的想法!

先把原始状态以及目标状态换一种表示方式,比如输入数据是的初始状态是1 2 3 4,表示成1 2 2 3 3 3 4 4 4 4,目标状态是4 3 2 0,表示成1 1 1 1 2 2 2 3 3。那么这题就是求把原始状态转化为目标状态的最小代价,只有三种操作, add, remove, transport,所以这就是一个求Edit Distance(编辑距离)的裸题!令f(i, j)表示初始状态的前i个转化为目标状态的前j个所需最小代价,则

f(i, j) = min(  f(i - 1, j) + y,     f(i, j - 1) + x,    f(i - 1, j - 1) + z * abs(a[i] - b[j])   )

其中a[i]表示初始状态的第i个是什么,同理b[j]。

#include <cstdio>
#include <algorithm>
#include <cstring> const int maxn = 105; int n, a[1005], b[1005], idxa, idxb, f[1005][1005], x, y, z, t; int main(void) {
freopen("landscape.in", "r", stdin);
freopen("landscape.out", "w", stdout);
scanf("%d%d%d%d", &n, &x, &y, &z);
memset(f, 0x3c, sizeof f);
for (int i = 1; i <= n; ++i) {
scanf("%d", &t);
while (t--) {
a[++idxa] = i;
}
scanf("%d", &t);
while (t--) {
b[++idxb] = i;
}
} for (int i = 1; i <= idxa; ++i) {
f[i][0] = i * y;
}
for (int j = 1; j <= idxb; ++j) {
f[0][j] = j * x;
}
f[0][0] = 0;
for (int i = 1; i <= idxa; ++i) {
for (int j = 1; j <= idxb; ++j) {
f[i][j] = std::min(std::min(f[i - 1][j] + y, f[i][j - 1] + x), f[i - 1][j - 1] + z * std::abs(a[i] - b[j]));
}
}
printf("%d\n", f[idxa][idxb]);
return 0;
}

  

最新文章

  1. NET出现频率非常高的笔试题
  2. HTML标签整理
  3. JS小数点加减乘除运算后位数增加的解决方案
  4. inline-block的简单理解
  5. Java导出数据为EXCEL的两种方式JXL和POI
  6. Asp.net 同时下载多个文件
  7. 【USACO 2.3.4】货币系统
  8. python---连接MySQL第二页
  9. WPF案例 (三) 模拟QQ“快速换装&quot;界面
  10. Android 之流媒体播放器,广播侧下方这么简单。
  11. Asp.NET路由管道处理过程 【重要】
  12. Spring mybatis源码篇章-XMLLanguageDriver解析sql包装为SqlSource
  13. python3.4 + Django1.7.7 表单的一些问题
  14. socket和webService的区别
  15. 微信小程序自定义导航栏
  16. vue.js报错:Module build failed: Error: No parser and no file path given, couldn&#39;t infer a parser.
  17. java.util.regex包下的Pattern类和Matcher类的使用总结
  18. Logstash读取Kafka数据写入HDFS详解
  19. Selenium基础知识(一)环境与搜索
  20. ReentrantReadWriteLock分析

热门文章

  1. python字符串连接方法效率比较
  2. SpringBoot初始教程之项目结构(一)
  3. C++标准I/O库:iostream, fstream, sstringstream
  4. 竞赛中经常使用的C++写法
  5. QC ALM 11创建域、项目和用户
  6. 生成随机string
  7. oracle多表关联多字段update
  8. (1)JDBC基础-java链接mysql数据库
  9. java定时器2-spring实现
  10. javascript来实现详细时间提醒信息效果