为什么会变成这样?记忆化慢一毫秒!!
查看原帖
为什么会变成这样?记忆化慢一毫秒!!
93701
Morgen_Kornblume楼主2020/11/25 21:25
#include<iostream>
#include<cstring>
#define ui unsigned int
#define reg register int
using namespace std;
int n;
int score[31];
ui maxx[31][31];
int findk[31][31];

ui memdfs(int l,int r){
	if(l==r){
		maxx[l][r]=score[l];
		findk[l][r]=l;
		return maxx[l][r];
	}
	for(reg i=l;i<=r;i++){
		ui lt,rt;
		
		if(i-1<l){
			lt=1;
		}
		else if(maxx[l][i-1]>0){
			lt=maxx[l][i-1];
		}
		else{
			lt=memdfs(l,i-1);
		}
		
		if(i+1>r){
			rt=1;
		}
		else if(maxx[i+1][r]>0){
			rt=maxx[i+1][r];
		}
		else{
			rt=memdfs(i+1,r);
		}
		
		if(lt*rt+score[i]>maxx[l][r]){
			maxx[l][r]=lt*rt+score[i];
			findk[l][r]=i;
		}
	}
	return maxx[l][r];
}

void layout(int l,int r){
	cout<<findk[l][r]<<" ";
	if(findk[l][r]-1>=l)layout(l,findk[l][r]-1);
	if(findk[l][r]+1<=r)layout(findk[l][r]+1,r);
	return;
}

int main(){
	memset(maxx,0,sizeof(maxx));
	ios::sync_with_stdio(false);
	cin>>n;
	for(reg i=1;i<=n;i++){
		cin>>score[i];
	}
	cout<<memdfs(1,n)<<endl;
	
	layout(1,n);
	
	return 0;
}

为什么?最优解普遍10毫秒,记忆化就11毫秒,为什么会变成这样?

2020/11/25 21:25
加载中...