L2-006 树的遍历 (25 分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
用的是递归的思想,找到每一层的根节点,然后进行建树。最后用个bfs将这个树输出
#include <iostream> #include<bits/stdc++.h> using namespace std; #include<queue> queue<int>que; int be[50],mid[50]; struct node { int l; int r; }a[50]; int build(int la,int ra,int lb,int rb) { if(la>ra) return 0; int rt=be[rb],p1,p2; p1=la; while(mid[p1]!=rt) p1++; p2=p1-la; a[rt].l=build(la,p1-1,lb,lb+p2-1); a[rt].r=build(p1+1,ra,lb+p2,rb-1); return rt; } void bfs(int x) { que.push(x); int flag=0; while(!que.empty()) { x=que.front(); if(!flag) cout<<x; else cout<<" "<<x; flag=1; que.pop(); if(a[x].l) que.push(a[x].l); if(a[x].r) que.push(a[x].r); } } int main() { int n,i,j; cin>>n; for(i=0;i<n;i++) { cin>>be[i]; } for(i=0;i<n;i++) { cin>>mid[i]; } build(0,n-1,0,n-1); int root=be[n-1]; bfs(root); return 0; }
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入
输入一行3个整数,用空格分开:n m k (1< =n,m< =50, 1< =k< =12)
接下来有 n 行数据,每行有 m 个整数 Ci (0< =Ci< =12)代表这个格子上的宝物的价值
接下来有 n 行数据,每行有 m 个整数 Ci (0< =Ci< =12)代表这个格子上的宝物的价值
输出
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 3 2 1 2 3 2 1 5
样例输出
14
#include<iostream> #include<bits/stdc++.h> using namespace std; #define mod 1000000007 int n,m,k; int a[50][50],vis[50][50][15][15]; int dfs(int x,int y,int num,int maxx) { if(vis[x][y][num][maxx+1]!=-1) { return vis[x][y][num][maxx+1]; } if(x==n&&y==m) { if(num==k) { return vis[x][y][num][maxx+1]=1; } else if(num==k-1&&a[x][y]>maxx) { return vis[x][y][num+1][a[x][y]+1]=1; } else return 0; } long long s=0; if(x+1<=n) { if(a[x][y]>maxx) { s+=dfs(x+1,y,num+1,a[x][y]); s%=mod; } s+=dfs(x+1,y,num,maxx); s%=mod; } if(y+1<=m) { if(a[x][y]>maxx) { s+=dfs(x,y+1,num+1,a[x][y]); s%=mod; } s+=dfs(x,y+1,num,maxx); s%=mod; } return vis[x][y][num][maxx+1]=s%mod; } int main() { cin>>n>>m>>k; int i,j; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>a[i][j]; } } memset(vis,-1,sizeof(vis)); dfs(1,1,0,-1); cout<<vis[1][1][0][0]<<endl; return 0; }
有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕.
数据规模和约定
m ≤ 20000,小蛋糕总数量≤50.
数据规模和约定
m ≤ 20000,小蛋糕总数量≤50.
输入
先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数
输出
输出一行包含一个整数表示大嘴最少需要吃的小蛋糕数量,若大嘴无法通过吃小蛋糕达到m的美味度和,则输出" > < “.
样例输入
10 2 4 1 2 10
样例输出
4
dp问题
#include <iostream> #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f int t[51]; int coin[51]; int dp[20002] = {0}; int main() { int n,m; cin>>m>>n; int i,j,k; for(i=1;i<=n;i++) { cin>>t[i]>>coin[i]; } for(i=1;i<=m;i++) { dp[i]=inf; } for(i=1;i<=n;i++) { for(j=1;j<=coin[i];j++) { for(k=m;k>=t[i];k--) { dp[k]=min(dp[k-t[i]]+1,dp[k]); } } } if(dp[m]==inf) cout << "><" << endl; else cout << dp[m] << endl; return 0; }