• [POJ1190]生日蛋糕<DFS>


    题目链接:http://poj.org/problem?id=1190

    题看上去确实很复杂

    涉及到半径面积这些,其实看着真的很头疼

    但是除去这些就是剪枝优化的dfs算法

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<utility>
    #include<stack>
    #include<cstdlib>
    #define ll long long
    #define inf 0x3fffffff
    #define maxn 10005
    #define maxm 30
    using namespace std;
    
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    
    void fre(){
         freopen("     .in","r",stdin);
         freopen("     .out","w",stdout);
    }
    
    int lminQ[maxm], lminV[maxm];
    int min_Q;
    int n,m;
    
    void dfs(int V, int Q, int step, int r, int h){
        if(step==0){
            if(V==n)min_Q=min(min_Q,Q);
            return;
        }
        if(V+lminV[step]>n || Q+lminQ[step]>min_Q)return;
        if(2*(n-V)/r+Q>=min_Q)return;
        int max_R=r-1;
        for(int i=max_R; i >= step; i--){
            if(step==m)Q=i*i;
            int max_H=min(((n-lminV[step-1]-V)/(i*i)), h-1);
            for(int j=max_H; j >= step; j--)
                dfs(V+i*i*j, Q+2*i*j, step-1, i, j);
        }
    }
    
    int main(){
        n=read();m=read();
        lminQ[0]=0,lminV[0]=0;
        for(int i=1;i<22;i++)
            lminQ[i]=lminQ[i-1]+2*i*i,lminV[i]=lminV[i-1]+i*i*i;
        min_Q=inf;
        dfs(0,0,m,100,10000);
        if(min_Q<inf)cout<<min_Q<<endl;
        else cout<<0<<endl;
        return 0;
    }
    View Code

    题不错

    下次再来思考思考

    这次借鉴了其他博主的思路

    不全是自己想的

  • 相关阅读:
    Flink批处理读取Hive写入MySql
    数组与链表的优缺点
    Flink任务暂停重启
    Flink优化总结
    Flink集群监控
    flink连接器-流处理-读写redis
    Flink连接器-批处理-读写Hbase
    flink on yarn
    java的常量定界符
    特殊注释的使用
  • 原文地址:https://www.cnblogs.com/Danzel-Aria233/p/12301272.html
Copyright © 2020-2023  润新知