【DP】RQNOJ #107 Ural的鹰蛋实验
2017-11-03 18:12
274 查看
题面在这里
实在不懂为什么如此经典的题目只能在这种SBOJ上做……
显然可以这样DP:
fi,j表示有i个蛋,要判断j层楼的最少次数
枚举在哪一层楼扔鸡蛋
fi,j=Min{Max{fi−1,k−1,fi,j−k}+1} (1≤k≤j)
但是这样时O(nm2)的,效率太低了
可以发现最多需要⌈logm2⌉个鸡蛋
所以状态数只有O(m⋅logm)了
示例程序:
实在不懂为什么如此经典的题目只能在这种SBOJ上做……
显然可以这样DP:
fi,j表示有i个蛋,要判断j层楼的最少次数
枚举在哪一层楼扔鸡蛋
fi,j=Min{Max{fi−1,k−1,fi,j−k}+1} (1≤k≤j)
但是这样时O(nm2)的,效率太低了
可以发现最多需要⌈logm2⌉个鸡蛋
所以状态数只有O(m⋅logm)了
示例程序:
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define cl(x,y) memset(x,y,sizeof(x)) using namespace std; const int maxn=1005,INF=0x3f3f3f3f; int n,m,f[maxn][maxn]; int dfs(int n,int m){ if (f [m]!=INF) return f [m]; int l=log2(m)+1-1e-7;if (n>=l) return l; for (int i=1;i<=m;i++) f [m]=min(f [m],max(dfs(n-1,i-1),dfs(n,m-i))+1); return f [m]; } int main(){ scanf("%d%d",&n,&m); cl(f,63); for (int i=1;i<=n;i++) f[i][0]=0; for (int j=1;j<=m;j++) f[1][j]=j; printf("%d",dfs(n,m)); return 0; }
相关文章推荐
- rqnoj-107-Ural的鹰蛋实验-dp
- 【DP】RQNOJ107[Ural的鹰蛋实验]题解
- RQNOJ 107 Ural的鹰蛋实验 解题报告
- RQNOJ107_鹰蛋实验
- RQNOJ 49 加分二叉树 (树形DP)
- Ural 1057. Amount of Degrees(数位DP)
- [URAL1519] Formula 1 [插头dp入门]
- 递推DP URAL 1119 Metro
- 【BZOJ1814】Ural 1519 Formula 1 插头DP
- URAL 1017 Staircases dp练习
- Ural 1260. Nudnik Photographer DP
- 递推DP URAL 1353 Milliard Vasya's Function
- URAL1152——状态压缩+DP——False Mirrors
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
- ural 1018(树形dp)
- ural 1171 DFS+DP
- ural 1057. Amount of Degrees(数位DP,4级)
- Ural 1167 Bicolored Horses (DP)
- Ural 1152 False Mirrors(状压DP)
- URAL 1031 很简单的DP..