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件宝贝。 
输入
输入一行3个整数,用空格分开:n  m  k  (1< =n,m< =50,  1< =k< =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. 

输入
先输入一行包含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;
}

 

 
posted on 2019-02-27 22:01  可怕hiahia  阅读(106)  评论(0编辑  收藏  举报