HDU 1227 Fast Food(经典DP)
2016-03-03 12:04
459 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1227
题意:在n个饭店之间选m个攻击点,使每个饭店到他的供给点的总路程的值最小
思路:在i到j这几个饭店之间建设一个供给站,供给站必须建在i到j中间的一个才能保证值最小,dp[i][j]表示在前j个饭店之间建设i个供给点,当建第i个供给点的时候第i-1个供给点肯定已经建成
AC代码:
题意:在n个饭店之间选m个攻击点,使每个饭店到他的供给点的总路程的值最小
思路:在i到j这几个饭店之间建设一个供给站,供给站必须建在i到j中间的一个才能保证值最小,dp[i][j]表示在前j个饭店之间建设i个供给点,当建第i个供给点的时候第i-1个供给点肯定已经建成
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> const int inf = 0x7f7f7f7f;//2139062143 typedef long long ll; using namespace std; int dp[40][210]; int a[210]; int cost(int x,int y)//在第x个饭店和第y个饭店之间建一个供给站的花费 { int t = (x + y) / 2; int sum = 0; for(int i=x; i<=y; i++) { sum += abs(a[i]-a[t]); } return sum; } int main() { int n,m; int cas = 0; while(scanf("%d%d",&n,&m)) { memset(dp,inf,sizeof(dp)); if(n + m == 0) break; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } for(int i=1; i<=n; i++) { dp[1][i]= cost(1,i); } for(int i=2; i<=m; i++) { for(int j=1; j<=n; j++) { for(int k=i-1; k<j; k++) { dp[i][j] = min(dp[i][j],dp[i-1][k] + cost(k+1,j));//在前个k个饭店建i-1个攻击点,最后一个供给点建在k+1到j之间 } } } printf("Chain %d\n",++cas); printf("Total distance sum = %d\n\n",dp[m] ); } return 0; }
相关文章推荐
- PowerDesigner对MySql数据库的Excel导入导出
- Linux系统中的ps进程查看命令使用实例集锦
- 第5章 让他人喜欢自己的心理策略
- srs之console调试
- 国内外三个不同领域巨头分享的Redis实战经验及使用场景
- DLL中dllmain重定义的解决办法
- 一道关于二级指针传参的问题
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-008-SpEL介绍
- swift 快速奔跑的兔几 本节的内容是:iOS上基于文档的应用程序
- C++ 虚函数表解析
- [置顶] 面试题总结 —— JAVA高级工程师
- 构建小模板
- Python使用struct处理二进制
- mysql-connector-c++ +vs2013x64 编译
- 系统相机相册最基本调用
- 移植opencv2.3.1 到tiny6410
- 使用OClint进行iOS项目的静态代码扫描
- 实用工具类--第三方开源--Lazy
- uva 10167 Birthday Cake
- linux面试基础考题