#include<bits/stdc++.h>
using namespace std;
int n,dp[500][500],ans=INT_MIN;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>dp[i][i];
ans=max(ans,dp[i][i]);
}
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++){
if(dp[i][j]&&dp[i][k]&&dp[k+1][j]&&dp[i][k]==dp[k+1][j]){
dp[i][j]=dp[i][k]+dp[k+1][j];
break;
}
}
for(int l=i,r=j;l<r-1;){
if(dp[i][j]) break;
if(!dp[i][l]) ++l;
else if(!dp[r][j]) --r;
else if(dp[i][l]==dp[r][j]){
if(dp[l+1][r-1]) {
dp[i][j]=dp[i][l]+dp[l+1][r-1]+dp[r][j];
}
else ++l, --r;
}else if (dp[i][l] < dp[r][j]) ++l;
else if (dp[i][l] > dp[r][j]) --r;
}
ans=max(ans,dp[i][j]);
}
}
cout<<ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, dp[500][500], ans = INT_MIN;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> dp[i][i];
ans = max(ans, dp[i][i]);
}
for (int len = 2; len <= n; len++) {
for (int i = 1; i <= n - len + 1; i++) {
int j = i + len - 1;
for (int k = i; k < j; k++) {
if (dp[i][k] && dp[k + 1][j] && dp[i][k] == dp[k + 1][j]) {
dp[i][j] = dp[i][k] + dp[k + 1][j];
break;
}
}
for (int l = i, r = j; l < r - 1;) {
if (dp[i][j]) break;
if (!dp[i][l]) ++l;
else if (!dp[r][j]) --r;
else if (dp[i][l] == dp[r][j]) {
if (dp[l + 1][r - 1]) dp[i][j] = dp[i][l] + dp[l + 1][r - 1] + dp[r][j];
else ++l, --r;
} else if (dp[i][l] < dp[r][j]) ++l;
else if (dp[i][l] > dp[r][j]) --r;
}
ans = max(ans, dp[i][j]);
}
}
cout << ans;
return 0;
}
上述两代码基本一样,但是一个过不了样例1,一个可以,这是为何?(人机好厉害,改一下就对了) |
---|