for(int i=0;i<s.size();i++)
for(int ss=V;ss>=0;ss--)
if(ss&s[i]==s[i])
dp[ss]=max(dp[ss],dp[ss^s[i]]+1);
for(int ss=V;ss>=0;ss--)
if(ss&s[i]==s[i])
dp[ss]=max(dp[ss],dp[ss^s[i]]+1);
JN亲自教我的!!
如果ss中有1,2,3.这三种物品,s[i]是3号物品,if这句话表示{1,2,3}含有{3}而dp[ss^s[i]]表示ss集合中去除s[i]后。
记住啊!
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <string.h>
using namespace std;
struct s{
int x,y;
}p[25];
int cmp(s a,s b){
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
bool issquare(int i,int j,int k,int l){
if(p[i].y==p[k].y&&p[i].x==p[j].x&&p[j].y==p[l].y&&p[l].x==p[k].x&&abs(p[j].y-p[i].y)==abs(p[l].x-p[j].x))
return true;
return false;
}
vector<int>vv;
int dp[1200000];
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1){
for(int i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
vv.clear();
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k=j+1;k<n;k++)
for(int l=k+1;l<n;l++)
if(issquare(i,j,k,l))
{
vv.push_back((1<<i)|(1<<j)|(1<<k)|(1<<l));
}
memset(dp,0,sizeof(dp));
for(int i=0;i<vv.size();i++){
for(int V=(1<<n)-1;V>=0;V--){
if((V&vv[i])==vv[i])
dp[V]=max(dp[V],dp[V^vv[i]]+1);
}
}
printf("%d\n",dp[(1<<n)-1]*4);
}
return 0;
}