bzoj 2165 DP
首先如果不考虑数据范围的话,因为每一层都是等效的,所以我们可以用w[i][j][k]来表示在某一层的j位置,称作i次电梯到k位置,最多上升多少层,那么我们可以比较容易的写出转移,因为m十分大,i可能与m同阶,所以我们不能直接枚举i,这样我们考虑二进制的思想,w[2^p][j][k]表示用了2^p次电梯,最多上升的层数,那么这样我们可以直接由w[2^p-1][j][mid]和w[2^p-1][mid][k]转移过来,但是这样求出来的是我们最少用2^p次可以到达m层,最后的答案可能会比这个小,那么我们可以逐位的判断答案,是否可以通过减少某一位的1仍能达到m层,那样我们这个1就可以去掉,也就是不断地更新答案,这样就好了。
反思:因为最后的答案可能是2^p,但是这样逐位的判断不能讲答案加回2^p,所以需要将答案的初值设为1.
/**************************************************************
Problem: 2165
User: BLADEVIL
Language: C++
Result: Accepted
Time:20640 ms
Memory:11392 kb
****************************************************************/
//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 110
#define maxx 60
#define LL long long
using namespace std;
LL g[maxn][maxn][maxn],p[maxn][maxn],q[maxn][maxn];
LL n,m;
void solve() {
LL t,ans=;
scanf("%d%lld",&n,&m);
memset(g,,sizeof(g));
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
t=;
scanf("%lld",&g[][i][j]),g[][i][j]=min(g[][i][j],m);
if (i==) t=max(t,g[][i][j]);
}
if (t==m) {
printf("1\n");
return;
}
int k;
for (k=;k<=maxx;k++) {
t=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
for (int mid=;mid<=n;mid++)
if (g[k-][i][mid]&&g[k-][mid][j])
g[k][i][j]=max(g[k][i][j],g[k-][i][mid]+g[k-][mid][j]);
g[k][i][j]=min(g[k][i][j],m);
if (i==) t=max(t,g[k][i][j]);
}
if (t==m) break;
}
memcpy(p,g[--k],sizeof(p));
for (ans+=1LL<<k--;k>=;k--) {
memset(q,,sizeof(q));
t=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
for (int mid=;mid<=n;mid++)
if (p[i][mid]&&g[k][mid][j])
q[i][j]=max(q[i][j],p[i][mid]+g[k][mid][j]);
q[i][j]=min(q[i][j],m);
if (i==) t=max(t,q[i][j]);
}
if (t!=m) {
ans+=1LL<<k;
memcpy(p,q,sizeof(p));
}
}
printf("%lld\n",ans);
}
int main() {
int test;
scanf("%d",&test);
while (test--) solve();
return ;
}
bzoj 2165 DP的更多相关文章
- [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...
- bzoj 3622 DP + 容斥
LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...
- BZOJ - 1003 DP+最短路
这道题被马老板毒瘤了一下,TLE到怀疑人生 //然而BZOJ上妥妥地过了(5500ms+ -> 400ms+) 要么SPFA太玄学要么是初始化block被卡到O(n^4) 不管了,不改了 另外D ...
- BZOJ 2431 & DP
题意:求逆序对数量为k的长度为n的排列的个数 SOL: 显然我们可以对最后一位数字进行讨论,判断其已经产生多少逆序对数量,然后对于前n-1位同样考虑---->每一个长度的排列我们都可以看做是相同 ...
- bzoj 1791 DP
首先对于一棵树我们可以tree_dp来解决这个问题,那么对于环上每个点为根的树我们可以求出这个树的一端为根的最长链,并且在tree_dp的过程中更新答案.那么我们对于环,从某个点断开,破环为链,然后再 ...
- bzoj 1592 dp
就是dp啊 f[i][j]表示到第i位,最后一位高度是j的最小花费 转移::f[i][j]=minn(f[i-1][k])+abs(a[i]-num[j]);(k<=j) #include< ...
- BZOJ 1207 DP
打一次鼹鼠必然是从曾经的某一次打鼹鼠转移过来的 以打每一个鼹鼠时的最优解为DP方程 #include<iostream> #include<cstdio> #include&l ...
- bzoj 1925 dp
思路:dp[ i ][ 0 ]表示第一个是山谷的方案,dp[ i ][ 1 ]表示第一个是山峰的方案, 我们算dp[ x ][ state ]的时候枚举 x 的位置 x 肯定是山峰, 然后就用组合数算 ...
- bzoj 1820 dp
最普通dp要4维,因为肯定有一个在上一个的位置,所以可以变为3维,然后滚动数组优化一下. #include<bits/stdc++.h> #define LL long long #def ...
随机推荐
- mac mysql连接报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
找了半天 又是kill进程,又是改设置文件,又是重启电脑,都不管用 翻到stackoverflow上的解决方案,实施成功: 原文链接:https://stackoverflow.com/questio ...
- 【PHP】- PHPStorm+XDebug进行调试图文教程
转载:https://www.cnblogs.com/LWMLWM/p/8251905.html 这篇文章主要为大家详细介绍了PHPStorm+XDebug进行调试图文教程,内容很丰富,具有一定的 ...
- LINUX硬件查看命令
1.查看系统PCI设备 lspci lspci -v 显示更详细的PCI设备信息 2.查看CPU信息 more / proc /cpuinfo 3.查看系统内存信息 more /proc /mem ...
- Matlab画平滑曲线的两种方法
自然状态下,用plot画的是折线,而不是平滑曲线. 有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值.下面是源程序,大家可以根据需要自行选择,更改拟合的参 ...
- dwarf是怎样处理的栈帧?
dwarf是如何处理的栈帧呢? 首先看下非dwarf的情况是如何处理栈帧的: 1 3623804982590 0x3e90 [0xb0]: PERF_RECORD_SAMPLE(IP, 0x1): 1 ...
- Oracle导数据到SQL server的方法总结
通过oracle10g 访问sql server 2008 导数据步骤 最近在项目中遇到要将Oracle数据库的数据导入到SQL server数据库中,解决办法如下: 一.准备工作 配置Oracle ...
- java直接访问JNDI工具代码
import java.sql.*; import java.util.*; import javax.naming.*; import javax.sql.DataSource; public cl ...
- 推荐算法相关总结表(包括DM)
推荐算法总结表 表1 推荐算法分类 个性化推荐算法分类 启发式算法 基于模型 基于内容 TF-IDF 聚类 最大熵 相似度度量 贝叶斯分类 决策树 神经网络 专家系统 知识推理 协同过滤 K近邻 聚类 ...
- 个人vim配置
YouCompletMe支持golang cd .vim/bundle/YouCompleteMe ./install.sh --clang-completer --go-completer clan ...
- Linux相关——记一些ubuntu相关快捷键&操作(持续更新)
(有一些是windows通用的...放上来凑字数...) 1, ctrl + alt + t.调出终端,这个没什么好解释的. 2, win + s.可以快速查看打开的窗口,并进行切换 3,win + ...