首页 > 代码库 > [NOIP2001] 普及组

[NOIP2001] 普及组

 

装箱问题

裸01背包,速刷过

技术分享
 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 using namespace std; 5 int sp[50000]={0}; 6 int f[50000]={0}; 7 int main(){ 8     int v,n; 9     cin>>v>>n;10     int i,j;11     for(i=1;i<=n;i++){12         scanf("%d",&sp[i]);13     }14     for(i=1;i<=n;i++)15      for(j=v;j>=sp[i];j--){16          f[j]=max(f[j],f[j-sp[i]]+sp[i]);17      }18     cout<<v-f[v];19     return 0;20 } 
装箱问题

 

 

求先序排列

中序排列串中的任意位置都可能是根。

后序排列串的最后一位一定是树的总根。

根据这两个性质,就可以寻找根节点,并递归处理左右子树了。

技术分享
 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 char s[10],c[10]; 9 void solve(int l,int la,int r,int ra){10     if(l>la || r>ra)return;11     printf("%c",c[ra]);12     for(int i=l;i<=la;i++){13         if(s[i]==c[ra]){14             solve(l,i-1,r,r+i-l-1);15             solve(i+1,la,r+i-l,ra-1);16             break;17         }18     }19     return;20 }21 int main(){22     scanf("%s",s+1);23     scanf("%s",c+1);24     int i,j;25     int len=strlen(s+1);26     solve(1,len,1,len);27     return 0;28 }
求先序排列

 

 

 

数的计算

记忆化DFS

其实DP也可以

技术分享
 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 const int mxn=1200; 8 int h[mxn]; 9 int n;10 int dfs(int x){11     if(h[x])return h[x];12     int i,j;13     int res=0;14     for(i=1;i<=x/2;i++){15         res++;16         res+=dfs(i);17     }18     if(!h[x])h[x]=res;19     return res;20 }21 int main(){22     scanf("%d",&n);23     cout<<dfs(n)+1<<endl;24     return 0;25 }
数的计算

 

[NOIP2001] 普及组