【NOIP2019普及级别模拟】最短路线(高精度+压位)

题目

最短路线

思路

DPS可发现规律:当前dp[i][j]=dp[i][j-1]+dp[i-1][j],但会TLE

需要注意的地方

要用要用高精度加法+压位(WTF)

码子

#include 
using namespace std;
const int N=801;
#define mod 100000000//对应进制数 
int n,m,len;
int a[N][N][101];
void cal(int x,int y){//dp[i][j]=dp[i][j-1]+dp[i-1][j] 
	int x2=x,y2=y-1;
	int x3=x-1,y3=y;
	int i=1,k=0;
	for(i=1;i<=81 && (a[x2][y2][i] || a[x3][y3][i]);++i){
		a[x][y][i]=a[x2][y2][i]+a[x3][y3][i]+k;
		k=a[x][y][i]/mod;
		a[x][y][i]%=mod;
	}
	--i;//i在跳出循环时已经自动加1
	if(k) a[x][y][++i]=k;
	if(x==n && y==m) len=i;
}
int main()
{
	scanf("%d %d",&m,&n);
	if(n==m&&n==1){printf("1");return 0;}
	for(int i=1;i<=N-1;i++)
	a[i][1][1]=a[1][i][1]=1;
	for(int i=2;i<=n;i++)
	for(int j=2;j<=m;j++)
		cal(i,j);
	printf("%d",a[n][m][len]);//处理高位 
	for(int i=len-1;i>=1;i--)
	printf("%0*d",8,a[n][m][i]);//输出8位 不足补0
	return 0;
} 

END~

你可能感兴趣的:(题解,模拟题)