0分求调
查看原帖
0分求调
1116005
I_never_give_up楼主2024/8/6 13:27

rt.数组开太大了,不知如何优化。

#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int read(){
	int s=0;
	short f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*((1<<3)+(1<<1))+c-'0';
		c=getchar();
	}
	return f*s;
}
void write(int n){
	if(n<0){
		putchar('-');
		n=-n;
	}
	if(n>=10){
		write(n/10);
	}
	putchar('0'+n%10);
}
int n,num[40005],ans,s[40005];
int dp[40005][40005];
//dp[i][j]表示从第i堆石子到第j堆石子时消耗的最小体力
int main(){
	n=read();
	for(int i=1;i<=n;++i) num[i]=read(),s[i]=s[i-1]+num[i];
	memset(dp,127,sizeof(dp));
	for(int i=0;i<205;++i) dp[i][i]=0;
	for(int len=2;len<=n;++len){
		for(int l=1;l+len-1<=n;++l){
			int r=l+len-1;
			for(int k=l;k<r;++k){
				dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+s[r]-s[l-1]);
			}
		}
	}
	write(dp[1][n]);
	return 0;
}
2024/8/6 13:27
加载中...