第一次做TC,基本上第一场就是适应环境了,过了几天瞻仰了一下rng_58的代码,Orz好强!!!
分析:
如果给了一棵树,那么暴力每个节点,就可以找出长度为
2
的个数了,设一个点有
dp[i][j][k]
表示用了
i
个节点形成一个图,该图总边数为
代码:
#include <bits/stdc++.h>
#define LL long long
#define FOR(i,x,y) for(int i = x;i < y;++ i)
#define IFOR(i,x,y) for(int i = x;i > y;-- i)
using namespace std;
const int maxn = 120;
const int maxm = 1010;
int dp[55][maxn][maxm];
class TreeAndPathLength2{
public:
string possible(int n,int s){
memset(dp,0,sizeof(dp));
dp[0][0][0] = 1;
FOR(i,0,54) FOR(j,0,maxn) FOR(k,0,maxm) if(dp[i][j][k] && (j+1<maxn)){
int d;
for(d = 1;j+d < maxn;++ d){
int kk = k + (d-1)*d/2;
if(kk < maxm) dp[i+1][j+d][kk] = 1;
}
}
if(dp[n][2*n-2][s] == 1) return "Possible";
else return "Impossible";
}
}ans;
int main(){
freopen("test.in","r",stdin);
int n,s;
while(~scanf("%d%d",&n,&s)){
ans.possible(n,s);
}
return 0;
}