bzoj3892[Usaco2014 Dec]Marathon

题意:

在二维平面上有N个点,从(x1,y1)到(x2,y2)的代价为|x1-x2|+|y1-y2|。求从1号点出发,按从1到N的顺序依次到达每个点的最小总代价。你有K次机会可以跳过某个点,不允许跳过1号点或N号点。n≤500。
题解:
dp。f[i][j]表示当前在i个点,剩j次,则f[i][j]=min(f[i+1][j]+abs(x[i+1]-x[i])+abs(y[i+1]-y[i]),f[i+k+1][j-k]),i+k+1≤n,k≤j。
代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 510
using namespace std; inline int read(){
char ch=getchar(); int f=,x=;
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return f*x;
}
int n,k,x[maxn],y[maxn],dp[maxn][maxn];
int dfs(int a,int b){
if(a==n)return ; if(dp[a][b]!=-)return dp[a][b];
dp[a][b]=dfs(a+,b)+abs(x[a]-x[a+])+abs(y[a]-y[a+]);
inc(i,,min(b,n-a-))dp[a][b]=min(dp[a][b],dfs(a+i+,b-i)+abs(x[a]-x[a+i+])+abs(y[a]-y[a+i+]));
return dp[a][b];
}
int main(){
n=read(); k=read(); inc(i,,n)x[i]=read(),y[i]=read(); memset(dp,-,sizeof(dp));
printf("%d",dfs(,k)); return ;
}

20160909

最新文章

  1. c# asp.net4.0尚未在web服务器上注册
  2. python 处理中文文件时的编码问题,尤其是utf-8和gbk
  3. saiku执行过程代码跟踪
  4. 自动adsl拨号上网
  5. JS、OnClientClick、OnClick
  6. elasticsearch配置文件解析
  7. Leetcode 240. Search a 2D Matrix II
  8. Android Bitmaps缓存
  9. 带你走进EJB--MDB
  10. android TDD平台插入双卡时,查看允许返回发送报告的选项,去掉勾选,不起作用
  11. UVALive 6467 Strahler Order 拓扑排序
  12. 爬虫:把廖雪峰的教程转换成 PDF 电子书
  13. Swift快速给Cocoa库内置类添加便捷初始化器
  14. linux(centos 7)学习之 ~目录下的文件anaconda-ks.cfg
  15. python数据类型:字典dict常用操作
  16. mi家前端面经
  17. Redis教程(Linux)
  18. Spring加载加密的配置文件
  19. 第一章 初始STM32
  20. MySql之修改操作与进阶

热门文章

  1. Python 发送 email 的两种方式
  2. Windows程序设计(2) - API-02 文件系统
  3. 7.kubernetes集群版本升级
  4. 使用本地http的yum源
  5. Maven全局配置文件settings.xml详解(转)
  6. 计算机网络之tcp四次挥手
  7. 入门大数据---Flink核心概念综述
  8. python根据列表创建文件夹,拷贝指定文件
  9. Java中栈和堆讲解
  10. node 模块正确暴露方法