F

来源:互联网 发布:赛博朋克2077 知乎 编辑:程序博客网 时间:2024/05/25 19:55
Let f (n) be the number of paths with n steps starting from O (0, 0), with steps of the type (1, 0), or (-1, 0), or (0, 1), and never intersecting themselves. For instance, f (2) =7, as shown in Fig.1. Equivalently, letting E=(1,0),W=(-1,0),N=(0,1), we want the number of words A1A2...An, each Ai either E, W, or N, such that EW and WE never appear as factors. 
Input
There are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means the number of steps(1<=n<=1000).
Output
For each test case, there is only one integer means the number of paths.
Sample Input
12
Sample Output
3

7

原本就以为是一道简单的递推就能解决的问题,没想到牵连到了大数,结果又只好重写,而且本人的递推公式不适合大数,建议使用更简洁的公式a[i]=2*a[i-1]+a[i-2];而我自己使用的是c[i]=a[i]+b[i],

a[i]=a[i-1]+b[i-1];b[i]=2*a[i-1]+b[i-1];

#include<stdio.h>#include<string.h>#include<string>#include<algorithm>int a[1010][1000],b[1010][1000],c[1010][1000];int main(){    memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));a[1][1]=1,b[1][1]=2;a[1][0]=1,b[1][0]=1;c[1][0]=1,c[1][1]=3;for(int i=2;i<=1005;i++)    {        int j=1,x=0;        while(j<=a[i-1][0]||j<=b[i-1][0]){            a[i][j]=a[i-1][j]+b[i-1][j]+x;            x=a[i][j]/10;a[i][j]%=10;j++;        }        a[i][j]=x;        if(a[i][j]==0)j--;        a[i][0]=j;        j=1,x=0;        while(j<=a[i-1][0]||j<=b[i-1][0]){            b[i][j]=2*a[i-1][j]+b[i-1][j]+x;            x=b[i][j]/10;b[i][j]%=10;j++;        }        b[i][j]=x;        if(b[i][j]==0)j--;        b[i][0]=j;        j=1,x=0;        while(j<=a[i][0]||j<=b[i][0])        {            c[i][j]=a[i][j]+b[i][j]+x;x=c[i][j]/10;c[i][j]%=10;j++;        }        c[i][j]=x;if(c[i][j]==0)j--;        c[i][0]=j;//a[i]=a[i-1]+b[i-1];//b[i]=2*a[i-1]+b[i-1];}int n;while(scanf("%d",&n)!=EOF){    for(int i=c[n][0];i>=1;i--)printf("%d",c[n][i]);    putchar('\n');}//printf("%d",strlen(a));return 0;}

#include<stdio.h>#include<string.h>#include<string>#include<algorithm>int a[1010][1000],b[1010][1000],c[1010][1000];int main(){    memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));a[1][1]=1,b[1][1]=2;a[1][0]=1,b[1][0]=1;c[1][0]=1,c[1][1]=3;for(int i=2;i<=1005;i++)    {        int j=1,x=0;        while(j<=a[i-1][0]||j<=b[i-1][0]){            a[i][j]=a[i-1][j]+b[i-1][j]+x;            x=a[i][j]/10;a[i][j]%=10;j++;        }        a[i][j]=x;        if(a[i][j]==0)j--;        a[i][0]=j;        j=1,x=0;        while(j<=a[i-1][0]||j<=b[i-1][0]){            b[i][j]=2*a[i-1][j]+b[i-1][j]+x;            x=b[i][j]/10;b[i][j]%=10;j++;        }        b[i][j]=x;        if(b[i][j]==0)j--;        b[i][0]=j;        j=1,x=0;        while(j<=a[i][0]||j<=b[i][0])        {            c[i][j]=a[i][j]+b[i][j]+x;x=c[i][j]/10;c[i][j]%=10;j++;        }        c[i][j]=x;if(c[i][j]==0)j--;        c[i][0]=j;//a[i]=a[i-1]+b[i-1];//b[i]=2*a[i-1]+b[i-1];}int n;while(scanf("%d",&n)!=EOF){    for(int i=c[n][0];i>=1;i--)printf("%d",c[n][i]);    putchar('\n');}//printf("%d",strlen(a));return 0;}
这个题目其实就是在于与大数结合,而递推其实不难。在本题中,觉得最大的收获就是在int类型中利用第一个元素来计数该数的位数。

原创粉丝点击