动态规划-hdu1227Fast Food
来源:互联网 发布:淘宝店招全屏显示 编辑:程序博客网 时间:2024/06/08 06:51
题意:
从n个地方选取k个地方,定义某个点的"距离"为 该点到k个点的距离 的最小值。 求n个点"距离"的最小值。
思路:
1.当k=1的时候我们可以轻松解决。
当k>=2的时候我们尽量往k=1靠拢, 不断让k--, 我们可以把长度为n的 切成k段。 k段中的每一段取的点都是中位数所在的点。
2.===== ++++ --------------------- (k = 3)
然后我们就枚举最后一段--------------------------
3. dp[i][j]表示前i个数 分成j段的最优值。 f(left,right)表示 [left,right]中距离的最小值的和。
dp[i][j] = min(dp[i][j],dp[k][j-1] + f(k+1,i));
代码:
#include <cstring>#include <stdio.h>#include <iostream>#include <cmath>#include <algorithm>using namespace std;int N,K;const int maxn = 220;const int maxk = 35;int a[maxn];int dp[maxn][maxk];int f(int l,int r) {int mid = (l + r) / 2;int ret = 0;for(int i=l;i<=r;i++) {ret += abs(a[i] - a[mid]);}return ret;} int main() {int C = 1;while(scanf("%d%d",&N,&K)) {if(N == 0 && K == 0) {break;}for(int i=1;i<=N;i++) {scanf("%d",&a[i]);}memset(dp,0x3f,sizeof(dp));for(int i=0;i<=K;i++) {dp[0][i] = 0;}for(int i=1;i<=N;i++) {for(int j=1;j<=K;j++) {for(int k=j-1;k+1<=i;k++) {dp[i][j] = min(dp[i][j],dp[k][j-1] + f(k+1,i));}}}printf("Chain %d\nTotal distance sum = %d\n\n",C++,dp[N][K]);}}
0 0
- hdu1227Fast Food【动态规划】
- 动态规划-hdu1227Fast Food
- ZOJ 1196 Fast Food 动态规划
- hdu 1227 fast food 动态规划
- UVA 662 Fast Food +经典动态规划
- HOJ-1005 Fast Food(动态规划)
- Fast Food hdu 1227 dp动态规划
- 动态规划训练25 [Food Delivery ZOJ
- Food
- Food
- Food
- 动态规划!!!动态规划!!!
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 仿QQ侧滑面板(二)
- 杭电题库刷题记录2014
- 《编写可读代码的艺术》读书笔记
- hdu(1521)——排列组合
- JNI接口详解
- 动态规划-hdu1227Fast Food
- 使用VS2015打包winform程序安装包简单方法(不需要InstallShield)
- 【NYOJ】[96]n-1位数
- &#x是什么编码以及转换方法(GB2312 UNICODE)
- 仿QQ侧滑面板(三)
- linux原始套接字(2)-icmp请求与接收
- 使用注解springmvc配合jsp/ajax/json,实现简单的jsp遍历后台数据
- Java compiler level does not match the version of the installed Java project facet
- JNI介绍