訓練指南-2.2-遞推-LA3516-多叉樹遍歷-溢出

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=300+10;
const int MOD=1000000000;
typedef long long LL;
char S[maxn];
int d[maxn][maxn];
int dp(int i,int j){
	if(i==j) return 1;
	if(S[i]!=S[j]) return 0;
	int& ans=d[i][j];
	if(ans>=0) return ans;
	ans=0;
	for(int k=i+2;k<=j;k++)if(S[k]==S[i]){
		ans=(ans+(LL)dp(i+1,k-1)*(LL)dp(k,j))%MOD;//LL保證不會溢出 !!!! 
	}
	return ans;
}
int main(){
	while(cin>>S){
		memset(d,-1,sizeof(d));
		cout<<dp(0,strlen(S)-1)<<endl;
	}
	return 0;
} 

題目求結果除以10^9的餘數
如果直接用

ans=(ans+dp(i+1,k-1)*dp(k,j))%MOD;計算
表達式裏面的ans+dp(i+1,k-1)*dp(k,j)可能溢出,導致錯誤,故強制轉換爲足夠大的LL類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章