社区讨论
why
P1880[NOI1995] 石子合并参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mj5etzll
- 此快照首次捕获于
- 2025/12/14 15:35 3 个月前
- 此快照最后确认于
- 2025/12/17 15:25 3 个月前
为什么P1775 石子合并(弱化版) 最小值过了
CPP#include<bits/stdc++.h>
using namespace std;
int sum[2500],dp[2500][2500];
int main()
{
int n;
cin>>n;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++){
int a;
cin>>a;
sum[i]=a+sum[i-1];
dp[i][i]=0;
}
for(int len=2;len<=n;len++){
for(int i=1;i<=n-len+1;i++){
int j=len+i-1;
for(int k=i;k<j;k++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
}
}
cout<<dp[1][n]<<endl;
return 0;
}
P1880 [NOI1995] 石子合并 最小值没过了???
CPP#include<bits/stdc++.h>
using namespace std;
int dp1[300][300],dp2[300][300],sum[300];
int main()
{
int n,a;
cin>>n;
memset(dp2,0x3f,sizeof(dp2));
for(int i=1;i<=n;i++){
cin>>a;
sum[i]=sum[i-1]+a;
dp2[i][i]=0;
dp1[i][i]=0;
}
for(int len=2;len<=n;len++)
{
for(int i=1;i<=2*n+len+1;i++){
int j=len+i-1;
for(int k=i;k<j;k++){
dp1[i][j]=max(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
dp2[i][j]=min(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
}
}
}
cout<<dp2[1][n]<<endl<<dp1[1][n]<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...