社区讨论
最小值对了最大值错了是啥情况qwq
P1880[NOI1995] 石子合并参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7wwqy5
- 此快照首次捕获于
- 2025/11/21 04:57 4 个月前
- 此快照最后确认于
- 2025/11/21 04:57 4 个月前
RT
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1010;
const ll INF=2147483647;
inline ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
inline void write(ll x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
ll n,a[maxn],sum[maxn],dp[maxn][maxn],ans1=INF,ans2=-INF;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=2*n;j++)dp[i][j]=INF;
}
for(int i=1;i<=n;i++)
{
a[i]=read();
sum[i]=sum[i-1]+a[i];
dp[1][i]=0;
}
for(int i=n+1;i<=2*n;i++)
{
a[i]=a[i-n];
sum[i]=sum[i-1]+a[i];
dp[1][i]=0;
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=j;k<=j+i-2;k++)
{
dp[i][j]=min(dp[k-j+1][j]+dp[j+i-k-1][k+1],dp[i][j]);
}
dp[i][j]+=sum[j+i-1]-sum[j-1];
}
}
for(int i=1;i<=n;i++)
{
ans1=min(ans1,dp[n][i]);
//cout<<ans1<<endl;
}
cout<<ans1<<endl;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=2*n;j++)dp[i][j]=-INF;
}
//for(int i=1;i<=n;i++)cout<<dp[1][i]<<endl;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=j;k<=j+i-2;k++)
{
dp[i][j]=max(dp[k-j+1][j]+dp[j+i-k-1][k+1],dp[i][j]);
}
dp[i][j]+=sum[j+i-1]-sum[j-1];
}
}
for(int i=1;i<=n;i++)
{
ans2=max(ans2,dp[n][i]);
//cout<<ans2<<endl;
}
cout<<ans2<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...