uva 11008 Antimatter Ray Clearcutting 状态压缩+记忆化搜索

uva 11008 Antimatter Ray Clearcutting 

dp思路:由于只有16棵树,所以可先预处理出可以一刀切的树的集合,stay_aline[i][j]沿着ij数切,所切的树的集合,可用一个32位大的数来表示,最低位是第0棵树,0表示不再这个集合中,1表示在,然后在用上三点共线的公式就可以处理出来了。记忆化搜索也是应用上了状态压缩,每次选两棵不同的数来切,除掉能切掉的数,在进行下一状态的搜索,这里不考虑切一棵树,因为如果不是只剩下一棵树,只切一棵树不是最优的方法。

code:

#include 
#include
#include
using namespace std;
const int maxn=20;
const int MM=1<<21;
const int inf=0x3f3f3f3f;
int n,m;
int x[maxn],y[maxn];
int stay_aline[maxn][maxn];
int dp[MM];
bool judge(int i,int j,int k)
{
    if((y[i]-y[k])*(x[j]-x[k])==(x[i]-x[k])*(y[j]-y[k]))
        return true;
    return false;
}
int dfs(int tr)
{
    int Min=inf;
    if(dp[tr]!=-1) return dp[tr];
    int res=0;
    for(int i=0; i=0; k--)
                {
                    stay_aline[i][j]<<=1;
                    if(judge(i,j,k))
                    {
                        stay_aline[i][j]+=1;
                    }
                }

            }
        }
        memset(dp,-1,sizeof(dp));
        int result=dfs((1<

你可能感兴趣的:(dp,状态压缩dp)