【DP】RQNOJ #107 Ural的鹰蛋实验

来源:互联网 发布:苹果6s蜂窝数据打不开 编辑:程序博客网 时间:2024/05/16 13:59

题面在这里

实在不懂为什么如此经典的题目只能在这种SBOJ上做……

显然可以这样DP:

fi,j表示有i个蛋,要判断j层楼的最少次数

枚举在哪一层楼扔鸡蛋

fi,j=Min{Max{fi1,k1,fi,jk}+1}         (1kj)

但是这样时O(nm2)的,效率太低了

可以发现最多需要logm2个鸡蛋

所以状态数只有O(mlogm)

示例程序:

#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[n][m]!=INF) return f[n][m];    int l=log2(m)+1-1e-7;if (n>=l) return l;    for (int i=1;i<=m;i++)     f[n][m]=min(f[n][m],max(dfs(n-1,i-1),dfs(n,m-i))+1);    return f[n][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;}