裸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 }