首页 > 代码库 > [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] 普及组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。