题目的意思是给你一个机器人,初始的时候在某一个给定的路灯位置,机器人要把路边所有的路灯关掉,每个路灯都有一个距离和一个功率,求要把所有的路灯关掉最小的最终能耗是多少?

题目是一个很明显的区间DP。可以这样考虑,机器人关掉一个区间的路灯后,一定停留在该区间的最左端或者最右端,而且必须包括起点,显然。

这样我们就可以区间dp了。

对于每一个含有初始位置的区间[i,j],只有两种位置使其最终的位置为j,那就是i和j-1。这样就得到了状态转移了。

接下来还有一个问题,就是怎么计算能耗呢?这样想,对于每个状态,表示关闭该区间的所有的灯后根据其所停留的位置,所有路灯的最小能耗总和。

所以我们可以对于每个路灯,用一个数组表示前面n个路灯的功耗总和,这样就可以dp了。

上代码:(效率还挺高的)

 #include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1010
using namespace std; int f[][maxn][maxn],w[maxn],d[maxn],n,k,tep,tep1,tep2; int main()
{
while (scanf("%d",&n)!=EOF)
{
scanf("%d",&k);
for (int i=; i<=n; i++) scanf("%d%d",&d[i],&w[i]),w[i]+=w[i-];
memset(f,0x3f,sizeof f);
f[][k][k]=f[][k][k]=;
for (int i=k; i>; i--)
for (int j=k; j<=n; j++)
{
if (i==j) continue;
tep=w[n]-w[j]+w[i];
tep1=tep*(d[i+]-d[i])+f[][i+][j];
tep2=tep*(d[j]-d[i])+f[][i+][j];
f[][i][j]=min(tep1,tep2);
tep=w[n]-w[j-]+w[i-];
tep1=tep*(d[j]-d[j-])+f[][i][j-];
tep2=tep*(d[j]-d[i])+f[][i][j-];
f[][i][j]=min(tep1,tep2);
}
printf("%d\n",min(f[][][n],f[][][n]));
}
return ;
}

最新文章

  1. Spring Boot整合Dubbo框架demo
  2. NSOperationQueue与GCD的使用原则和场景
  3. SQL Server如何删除多余tempDB文件
  4. 关于 iOS 的一些学习资料
  5. Oracle自增列
  6. iOS网络请求之---GET和POST
  7. java class生成jar包(转)
  8. (转载)CSS中zoom:1的作用
  9. 9个Console控制台命令(转载)
  10. yii框架后台过滤器的使用 安全防护
  11. The Moving Points hdu4717
  12. mysql实现主从备份
  13. SQL对某个字段进行排名
  14. Java线程安全与锁优化
  15. 【转】简明 Vim 练级攻略
  16. mpvue小程序图片404
  17. 软件工程之四则运算--Github
  18. git 查看一个分支是否被合并过
  19. centos安装python与jdk
  20. java一些对象概念扫盲帖(DO VO DTO PO)

热门文章

  1. 20155230 2016-2017-2 《Java程序设计》第四周学习总结
  2. 20155311《Java程序设计》实验五(网络编程与安全)实验报告
  3. #20155327 2016-2017-2 《Java程序设计》第三周学习总结
  4. [BZOJ4444][SCOI2015]国旗计划-[ST表]
  5. 基于 OpenCV 的人脸识别
  6. day 1 异常基本功能
  7. js的视频和音频采集
  8. [css 实践篇]CSS中的尺寸单位
  9. DevOps是一种文化,不是角色!
  10. Qt 将字符串转成16进制显示