今天做了“逆序对”(非经典问题),动态规划加高精度。。。
①高精度加法要多加练习【直接用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;
}