博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UESTC 594 我要长高 dp单调队列优化入门
阅读量:4984 次
发布时间:2019-06-12

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

//其实是个伪单调队列...渣渣刚入门

//戳这里:

//dp[ i ][ j(现身高) ] = min(    dp[ i ][ k(现身高) ]  + fabs( j(现身高) - k(现身高) ) * C + ( j(现身高) - h[i](原身高) )  *( j(现身高) - h[i](原身高) )     );

观察到可以单调队列优化,O(N * H * H)  —>  O(N * H)

j >= k 时,

dp[ i ][ j ] = min (    dp[ i - 1 ][ k ] + ( j - k ) * C + ( j - h[i] ) * ( j - h[i] )  ); <==>  dp[ i ][ j ] = min (    dp[ i  - 1][ k ]  - k * C    ) +  j * C + ( j - h[i] ) * ( j - h[i] );

j <= k 时,

dp[ i ][ j ] = min (    dp[ i - 1 ][ k ] + ( k - j ) * C + ( j - h[i] ) * ( j - h[i] )  ); <==>  dp[ i ][ j ] = min (    dp[ i - 1 ][ k ]  + k * C    ) -  j * C + ( j - h[i] ) * ( j - h[i] );

将 k 替换成 j, 实现一边维护 dp_pre, 一边求解 dp[ i ][ j ]

1 #include "bits/stdc++.h" 2 using namespace std; 3 int N, C; 4 int h[50010]; 5 int dp[50010][110]; 6 const int INF = 0x3f3f3f3f; 7  8 int main() 9 {10     while(scanf("%d%d", &N, &C) != EOF) {11         memset(dp, INF, sizeof(dp[0]) * (N + 1)); //直接 memset(dp, INF, sizeof(dp)); 会T...12         int i;13         for(i = 1; i <= N; ++i) {14             scanf("%d", &h[i]);15         }16         int j, k;17         for(j = h[1]; j <= 100; ++j) {18             dp[1][j] = (j - h[1]) * (j - h[1]);19         }20 21         int dp_pre;22         for(i = 2; i <= N; ++i) {23             //k <= j 的情况24             dp_pre = INF;25             for(j = h[i - 1]; j <= 100; ++j) {26                 dp_pre = min(dp_pre, dp[i - 1][j] - j * C);27                 if(j >= h[i]) {28                     dp[i][j] = dp_pre + j * C + (j - h[i]) * (j - h[i]);29                 }30             }31 32             //k >= j 的情况33             dp_pre = INF;34             for(j = 100; j >= h[i]; --j) {35                 if(j >= h[i - 1]) {36                     dp_pre = min(dp_pre, dp[i - 1][j] + j * C);37                 }38                 dp[i][j] = min(dp[i][j], dp_pre - j * C + (j - h[i]) * (j - h[i]));39             }40         }41         int res = INF;42         for(j = 1; j <= 100; ++j) {43             res = min(res, dp[N][j]);44         }45         printf("%d\n", res);46     }47 }

 

转载于:https://www.cnblogs.com/AC-Phoenix/p/4467017.html

你可能感兴趣的文章
Shell编程(二)Bash中调用Python
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>
cas-client-core单点登录排除不需要拦截的URL
查看>>
OCR技术浅探 : 文字定位和文本切割(2)
查看>>
jmeter集合点
查看>>
Java类代码块执行顺序
查看>>
克鲁斯卡尔(模板题)
查看>>
汉字转拼音
查看>>
Python中Web框架编写学习心得
查看>>
dataTable/dataSet转换成Json格式
查看>>
asp.net core模块学习
查看>>
MySQL远程连接不上的解决方法
查看>>
如何使用JMeter从文件中提取数据
查看>>
AndroidBase基础类文档
查看>>
使用delphi 开发多层应用(十九) ios通过soap 访问kbmmw服务器
查看>>
三大特征 封装 继承 多态
查看>>
Python 3 函数分类
查看>>
通过.frm表结构和.ibd文件恢复数据
查看>>