9.28做题总结

今天做了“逆序对”(非经典问题),动态规划加高精度。。。

①高精度加法要多加练习【直接用int】。

②解的位数要算【像本题,解的位数是大于50的,开50的高精度70分。

③像数学题的要仔细分析【不一定是数学】。

附:50分代码【非高精度】,AC代码【高精度】

=======================我是分割线=======================

//50分代码
#include<stdio.h>
const int maxn=51;
const int maxm=1300;
long long f[maxn][maxm];int N,M;
int main(){
    scanf("%d",&N);scanf("%d",&M);
    for(int i=0;i<=N;i++)f[i][0]=1;
    for(int i=1;i<=N;i++)
      for(int j=1;j<=M;j++){
        int k_limit=j<i-1?j:i-1;
        for(int k=0;k<=k_limit;k++)f[i][j]+=f[i-1][j-k];
      }
    printf("%I64d\n",f[N][M]);
    return 0;
}


=======================我是分割线=======================

//AC代码
#include<stdio.h>
#include<string.h>
const int maxl=50;
const int maxn=51;
const int maxm=1225;
int f[maxn][maxm][maxl],N,M;
inline void add(int a[],int b[]){
     int la=a[0],lb=b[0],lc=la>lb?la:lb;
     int tmpa[maxl],tmpb[maxl],tmpc[maxl];
     memset(tmpa,0,sizeof(tmpa));
     memset(tmpb,0,sizeof(tmpb));
     memset(tmpc,0,sizeof(tmpc));
     for(int i=1;i<=la;i++)tmpa[i]=a[la-i+1];
     for(int i=1;i<=lb;i++)tmpb[i]=b[lb-i+1];
     for(int i=1;i<=lc;i++)tmpc[i]=tmpa[i]+tmpb[i];
     for(int i=1;i<=lc;i++)tmpc[i+1]+=tmpc[i]/10,tmpc[i]%=10;
     if(tmpc[lc+1])lc++;
     for(int i=lc,j=1;i>=1;)a[j++]=tmpc[i--];
     a[0]=lc;
}
int main(){
    scanf("%d",&N);scanf("%d",&M);
    for(int i=0;i<=N;i++)f[i][0][1]=f[i][0][0]=1;
    for(int i=1;i<=N;i++)
      for(int j=1;j<=M;j++){
        int k_limit=j<i-1?j:i-1;
        for(int k=0;k<=k_limit;k++)
          add(f[i][j],f[i-1][j-k]);
      }
    for(int i=1;i<=f[N][M][0];i++)printf("%d",f[N][M][i]);
    printf("\n");
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值