20171025

昨天的考试:

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 }
原文地址:https://www.cnblogs.com/FOXYY/p/7734983.html