• 洛谷P1464 Function


    题目链接:https://www.luogu.org/problem/show?pid=1464

    题目要求:根据描述写出一个相应的递归函数

    解法:

    一开始看到想暴力解出来的,但看到了题目给的提示感觉会TEL,于是看了题解。

    本题正规解法为记忆化搜索,应该是比较简单的一个example了,以后感觉会慢慢深入;

    记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。

    AC code:

    #include <stdio.h>

    long long int ans[25][25][25];
    long long int n1[500][5],n2[500][5];

    int w(int a,int b,int c)
    {
     if(a<=0 || b<=0 || c<=0) return 1;
     else if(ans[a][b][c]!=0) return ans[a][b][c];
     else if(a>20 || b>20 || c>20)  ans[a][b][c]=w(20,20,20);
     else if(a<b && b<c)  ans[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
     else  ans[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
     return ans[a][b][c];
    }
    int main()
    {
     for(int i=1;i<=24;i++)
     {
      for(int j=1;j<=24;j++)
      {
       for(int k=1;k<=24;k++)
       {
        ans[i][j][k]=0;
       }
      }
     }
     int i;
     for(i=1;;i++)
     {
      scanf("%lld%lld%lld",&n1[i][1],&n1[i][2],&n1[i][3]);
      n2[i][1]=n1[i][1];
      n2[i][2]=n1[i][2];
      n2[i][3]=n1[i][3];
      if(n1[i][1]>20) n1[i][1]=21;
      if(n1[i][2]>20) n1[i][2]=21;
      if(n1[i][3]>20) n1[i][3]=21;
      if(n1[i][1]==-1&&n1[i][2]==-1)
      {
       if(n1[i][3]==-1)
       {
        i--;
        break;
       }
      }
     }
     //printf("%d ",i);
     for(int j=1;j<=i;j++)
     {
      printf("w(%lld, %lld, %lld) = %lld ",n2[j][1],n2[j][2],n2[j][3],w(n1[j][1],n1[j][2],n1[j][3]));
     }
     return 0;
    }

    ps:格式真的坑人~

  • 相关阅读:
    C#3.0实现变异赋值(Mutantic Assignment)
    博客园积分算法探讨
    C#动静结合编程之二: 两种哲学
    REST构架风格介绍之二:CRUD
    C# vs C++之一:委托 vs 函数指针
    REST构架风格介绍之一:状态表述转移
    C#动静结合编程之三:Duck Typing
    C#动静结合编程之四:泛型委托
    C# vs C++之二:GC vs RAII
    Ecshop文章分类列表页如何自定义Title以提高SEO效果
  • 原文地址:https://www.cnblogs.com/DemonZiv/p/7098951.html
Copyright © 2020-2023  润新知