博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1220 关路灯
阅读量:3949 次
发布时间:2019-05-24

本文共 1161 字,大约阅读时间需要 3 分钟。

在这里插入图片描述

区间dp,dp[i][j][0]表示关完第i到第j的灯之后在第i个灯的最小功耗,dp[i][j][1]表示关完第i到第j的灯之后在第j个灯的最小功耗。对于dp[i][j][1]一定优先是由i到j-1转移过来功耗最小,对于dp[i][j][0]一定是由i+1到j转移过来功耗最小。究竟有没有在转移时回头我们不能确定。我们要计算出所有灯的前缀和sum[i]来方便维护dp,所以状态转移方程为:

dp[s][e][0]=min(dp[s+1][e][0]+(x[s+1]-x[s])(sum[n]-sum[e]+sum[s]),dp[s+1][e][1]+(x[e]-x[s])(sum[n]-sum[e]+sum[s]));

dp[s][e][1]=min(dp[s][e-1][0]+(x[e]-x[s])(sum[n]-sum[e-1]+sum[s-1]),dp[s][e-1][1]+(x[e]-x[e-1])(sum[n]-sum[e-1]+sum[s-1]));

#include
using namespace std;const int maxn=57;int dp[maxn][maxn][5];int sum[maxn];int n,c,x[maxn],y[maxn];int main(){
memset(dp,0x3f,sizeof(dp)); scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) {
cin>>x[i]; cin>>y[i]; sum[i]=sum[i-1]+y[i]; } dp[c][c][0]=dp[c][c][1]=0; for(int l=2;l<=n;l++) for(int s=1;s+l-1<=n;s++) {
int e=s+l-1; dp[s][e][0]=min(dp[s+1][e][0]+(x[s+1]-x[s])*(sum[n]-sum[e]+sum[s]),dp[s+1][e][1]+(x[e]-x[s])*(sum[n]-sum[e]+sum[s])); dp[s][e][1]=min(dp[s][e-1][0]+(x[e]-x[s])*(sum[n]-sum[e-1]+sum[s-1]),dp[s][e-1][1]+(x[e]-x[e-1])*(sum[n]-sum[e-1]+sum[s-1])); } printf("%d\n",min(dp[1][n][1],dp[1][n][0])); return 0;}

转载地址:http://hsgwi.baihongyu.com/

你可能感兴趣的文章
惰性求值,可组合和模块化的JavaScript
查看>>
How to Extend Django User Model 如何扩展Django用户模型
查看>>
两个行业的故事:编程语言与富裕国家和发展中国家之间的差异
查看>>
15个用于管理MySQL服务器mysqladmin命令
查看>>
服务器端I / O性能:Node,PHP,Java与Go
查看>>
多行文本编辑时,同一行编辑不同类型的字符时自动换行的问题
查看>>
如何使开机动画只播一次
查看>>
如何在平台上实现LED灯的效果?如信号灯,来短信/来电时LED动画闪烁
查看>>
restore factory属性的enable和disable
查看>>
Android LOG机制流程图
查看>>
如何在JNI中抛异常
查看>>
Android应用程序的完全退出
查看>>
Task和Activity相关的一些属性
查看>>
JAVA系统属性之user.home
查看>>
Android代码截屏
查看>>
Android中打印代码的调用层次
查看>>
成功者十三个价值连城的习惯
查看>>
特别成功的人会做6件事
查看>>
Android: 用jni 获取MAC地址
查看>>
字符串列表的C语言实现:c_strlist
查看>>