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;
}