DFS 剪枝与优化

1.优化搜索顺序 优先搜索分支较少的节点

2.排除等效冗余

3.可行性剪枝

4.最优性剪枝

5.记忆化搜索(DP)


1.小猫爬山

#include 
using namespace std;
const int N=20;
int n,m;
int w[N];
int sum[N];
int ans=N;
void dfs(int u,int k)
{
    //最优性剪枝
    if(k>=ans) return ;
    if(u==n)
    {
        ans=k;
        return ;
    }
    for(int i=0;i>n>>m;
    for(int i=0;i>w[i];
    sort(w,w+n);
    reverse(w,w+n);
    dfs(0,0);
    cout<

2.数独

#include 
using namespace std;
const int N=9;
int row[N],col[N],cell[3][3];
char str[100];
int ones[1<>j&1;
    while(cin>>str,str[0]!='e')
    {
        init();
        int cnt=0;
        for(int i=0,k=0;i

3.小木棍

#include 
using namespace std;
const int N=70;
int n;
int w[N],sum,length;
bool st[N];
bool dfs(int u,int s,int sta)
{
    if(u*length==sum)
        return true;
    if(s==length) return dfs(u+1,0,0);
    for(int i=sta;ilength) continue;
        st[i]=true;
        if(dfs(u,s+w[i],i+1)) return true;
        st[i]=false;
        if(!s) return false;
        if(s+w[i]==length) return false;
        int j=i;
        while(j>n,n)
    {
        memset(st,false,sizeof st);
        sum=0;
        for(int i=0;i>w[i];
            sum+=w[i];
        }
        sort(w,w+n);
        reverse(w,w+n);
        length=1;
        while(true)
        {
            if(sum%length==0&&dfs(0,0,0))
            {
                cout<

4.生日蛋糕

注释里面的最后一个剪枝

DFS 剪枝与优化_第1张图片

转载于:AcWing 168. 生日蛋糕【图解+推导】 - AcWing

 

#include 
using namespace std;
const int N=25;
int n,m;
int minv[N],mins[N];
int r[N],h[N];
int ans=INT_MAX;
void dfs(int u,int v,int s)
{
    if(v+minv[u]>n) return ;
    if(s+mins[u]>=ans) return ;
    ///最后一个剪枝
    if(s+2*(n-v)/r[u+1]>=ans) return ;
    if(!u)
    {
        if(v==n)
            ans=s;
            return ;
    }
    for(int R=min(r[u+1]-1,(int)sqrt(n-v));R>=u;R--)
    {
        for(int H=min(h[u+1]-1,(n-v)/R/R);H>=u;H--)
        {
            int t=0;
            if(u==m)
                t=R*R;
            r[u]=R,h[u]=H;
            dfs(u-1,v+R*R*H,s+2*R*H+t);
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        minv[i]=minv[i-1]+i*i*i;
        mins[i]=mins[i-1]+2*i*i;
    }
    r[m+1]=h[m+1]=INT_MAX;
    dfs(m,0,0);
    cout<

你可能感兴趣的:(深度优先,剪枝,算法)