区间DP, 考虑设\(dp[i][j][t]\)为已经关掉了\([i,j]\)的电灯, 人在t端点处时的最小代价

可以推出方程:

\[dp[i+1][j][0]+(p[n]-p[j]+p[i])*(loc[i+1]-loc[i]) -> dp[i][j][0]
\]

\[dp[i][j-1][0]+(p[n]-p[j-1]+p[i-1])*(loc[j]-loc[i]) -> dp[i][j][1]
\]

\[dp[i][j-1][1]+(p[n]-p[j-1]+p[i-1])*(loc[j]-loc[j-1]) -> dp[i][j][1]
\]

\[dp[i+1][j][1]+(p[n]-p[j]+p[i])*(loc[j]-loc[i]) -> dp[i][j][0]
\]

直接DP... 且慢, 顺序是什么...... 好像很麻烦的样子......

但是其实可以不用考虑顺序问题的, 一位超强的选手\(wyx\)说过:

\(\text{「记忆化搜索, 就是用来解决这种顺序有关的DP的」}\)

如果采用记忆化搜索, 啥都不用想一顿码, 码完AC, 极其快乐, 比那些DP不知道高到哪里去了

code:

#include<bits/stdc++.h>
using namespace std; /*Copyright [tyqtyq](http://oiertyq.github.io). All rights served.*/
#define f(i,x,y) for(int i=x,i##end=y;i<=i##end;++i)
#define d(i,x,y) for(int i=x,i##end=y;i>=i##end;--i)
#define ri register int
#define ll long long
#define il inline
namespace intio{char ch; int read(){ ri x=0,f=1; while(!isdigit((ch=getchar()))) f=ch=='-'?-1:1; while(isdigit(ch)) x=x*10+ch-'0', ch=getchar(); return x*f; } void read(int& x) {x = read();}}; using namespace intio;
int max(int x, int y) {return x>y?x:y;} int min(int x, int y) {return x<y?x:y;}
#define _ 100
int loc[_], p[_];
int dp[_][_][2] ;
int n, c;
// dp[i][j][t]: 已经关掉了[i,j]的电灯, 人在t端点处
// dp[i+1][j][0]+(p[n]-p[j]+p[i])*(loc[i+1]-loc[i]) -> dp[i][j][0]
// dp[i][j-1][0]+(p[n]-p[j-1]+p[i-1])*(loc[j]-loc[i]) -> dp[i][j][1]
// dp[i][j-1][1]+(p[n]-p[j-1]+p[i-1])*(loc[j]-loc[j-1]) -> dp[i][j][1]
// dp[i+1][j][1]+(p[n]-p[j]+p[i])*(loc[j]-loc[i]) -> dp[i][j][0]
void work(int i,int j){
if(i>j) return ;
if(dp[i+1][j][0]==0x3f3f3f3f) work(i+1, j);
if(dp[i][j-1][0]==0x3f3f3f3f) work(i, j-1);
dp[i][j][0] = min(dp[i+1][j][0]+(p[n]-p[j]+p[i])*(loc[i+1]-loc[i]), dp[i+1][j][1]+(p[n]-p[j]+p[i])*(loc[j]-loc[i]));
dp[i][j][1] = min(dp[i][j-1][0]+(p[n]-p[j-1]+p[i-1])*(loc[j]-loc[i]), dp[i][j-1][1]+(p[n]-p[j-1]+p[i-1])*(loc[j]-loc[j-1]));
}
int main(){
memset(dp, 0x3f, sizeof(dp)) ;
scanf("%d%d",&n,&c) ;
f(i,1,n) scanf("%d%d", &loc[i], &p[i]), p[i] += p[i-1] ;
dp[c][c][1] = dp[c][c][0] = 0 ;
work(1,n);
cout<<min(dp[1][n][1], dp[1][n][0]) ;
return 0;
}

最新文章

  1. java中的多线程
  2. SQL Server 2016 CTP2.2 的关键特性
  3. 添加jre/jdk A java Exception occurred
  4. [Xamarin] 取得所有已安裝軟體清單 (转帖)
  5. DA - 信息分析思路概要
  6. 扩展HT for Web之HTML5表格组件的Renderer和Editor
  7. POJ - 3652 Persistent Bits
  8. URAL1658. Sum of Digits(DP)
  9. Ubuntu/Linux 笔记应用 为知笔记(支持markdown)
  10. Java学习之网络编程实例
  11. 在程序异常中记录堆栈信息(使用ExWatcher)
  12. Razor基础语法
  13. 如何备份、还原或迁移 WhatsApp 的信息和资料?
  14. Node学习——开篇
  15. Android okHttp网络请求库详解
  16. rsync 远程拷贝
  17. pycharm设置文件编码
  18. A short Glimpse to Spectral Sequences 快速入坑谱序列(英文)
  19. jmeter每10个停一会实现方案
  20. 单细胞参考文献 single cell

热门文章

  1. JAVA基础-反射机制
  2. 针对phpstudy默认设置的利用
  3. Redis详解(六)——哨兵机制
  4. 007.CI4框架CodeIgniter, 加载自己的helper辅助类,调用自己helper中定义各种全局函数
  5. ucosiii 移植
  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-file
  7. JuJu团队12月3号工作汇报
  8. Linus Torvalds正式宣布Linux Kernel 5.1RC2 发布,相当正常
  9. LINUX——磁盘管理
  10. idea新建maven web项目