昨天的考试:
T1,原题
T2,好吧,我想到正解了,然而我并没有看到1024的内存限制,然后我开了一个10000×100的数组,然后....我按正解转移的,全RE了,就拿了20分。好吧其实就算看到了内存限制,这题也A不掉,树归合并子树的时候,一定要先更新,然后再在now上加上size,因为这样转移才是n^2的,之前的转移,在某些数据下要比n^2大得多得多得多得多得多,
T3,是个搜索,早知道就多打一会表,lc的优化是把前面多的预处理出来,用map存一存,然后后面全是1的,直接用组合数算一算,然后中间的话以为最后在map里找的时候只关注互质的结果,所以在每一步都约掉最大公约数,这样记忆化搜索的时候,map存的东西少了,查找也会快一点
在这附上T2的代码比较:
AC:
1 void dfs2(int x,int fa){ 2 f[x][0]=0; p[x][0]=0; 3 int now=0; 4 for(int i=adj[x];i!=-1;i=g[i].nxt){ 5 int v=g[i].v; if(v==fa) continue; 6 dfs2(v,x); 7 for(int j=now;j>=0;j--){ 8 for(int k=size[v];k>=1;k--){ 9 p[x][j+k]=Min(p[x][j+k],f[x][j]+p[v][k]); 10 p[x][j+k]=Min(p[x][j+k],p[x][j]+f[v][k]); 11 f[x][j+k]=Min(f[x][j+k],f[x][j]+f[v][k]); 12 } 13 } 14 now+=size[v]; 15 } 16 now++; 17 for(int i=now;i>=1;i--) p[x][i]=p[x][i-1]+w[x],f[x][i]=f[x][i-1]+2*w[x]; 18 }
T死:
1 void dfs2(int x,int fa){ 2 f[x][0]=0; p[x][0]=0; 3 int now=0; 4 for(int i=adj[x];i!=-1;i=g[i].nxt){ 5 int v=g[i].v; if(v==fa) continue; 6 dfs2(v,x); now+=size[v]; 7 for(int j=now;j>=1;j--){ 8 for(int k=1;k<=size[v];k++){ 9 if(j-k<0) break; 10 p[x][j]=Min(p[x][j],f[x][j-k]+p[v][k]); 11 p[x][j]=Min(p[x][j],p[x][j-k]+f[v][k]); 12 f[x][j]=Min(f[x][j],f[x][j-k]+f[v][k]); 13 } 14 } 15 } 16 now++; 17 for(int i=now;i>=1;i--) p[x][i]=p[x][i-1]+w[x],f[x][i]=f[x][i-1]+2*w[x]; 18 }