for(int i=1;i<n-1;++i)
for(int j=i+2;j<=n;++j)
for(int k=i;k<j;k++){
if(f[i][k]==0||f[k+1][j]==0) continue;
if(f[i][k]==f[k+1][j]){
f[i][j]=f[i][k]+1;
break;
}
}
这样?
for(int i=1;i<n-1;++i)
for(int j=i+2;j<=n;++j)
for(int k=i;k<j;k++){
if(f[i][k]==0||f[k+1][j]==0) continue;
if(f[i][k]==f[k+1][j]){
f[i][j]=f[i][k]+1;
break;
}
}
这样?
初值的话是不是需要循环里添加以下
#include <bits/stdc++.h>
using namespace std;
int s[249],n,f[249][249],ans;
int main(){
cin>>n;for(int i=1;i<=n;++i)scanf("%d",&s[i]),f[i][i]=s[i];
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
f[i][j]=max(f[i][j-1],s[j]);
for(int i=1;i<n-1;++i)
for(int j=i+2;j<=n;++j)
for(int k=i;k<j;k++){
if(f[i][k]==0||f[k+1][j]==0) continue;
if(f[i][k]==f[k+1][j]){
f[i][j]=f[i][k]+1;
ans=max(ans,f[i][j]);
break;
}
}
cout << ans;
}
WA10分
赋初值
我知道了
你把这个循环删掉,然后下面的区间 dp 改成这样的格式:
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
/*这里不变*/
}
}
还有,i==j 的时候也要记录 ans,因为可能一个都合并不了,就要在原数组中找最大值
#include <bits/stdc++.h>
using namespace std;
int s[249],n,f[249][249],ans;
int main(){
cin>>n;for(int i=1;i<=n;++i)scanf("%d",&s[i]),f[i][i]=s[i],ans=max(ans,s[i]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
f[i][j]=max(f[i][j-1],s[j]);
for(int len=2;len<=n;len++)
for(int i=1;i<n-1;++i){
int j=i+len-1;
for(int k=i;k<j;k++){
if(f[i][k]==0||f[k+1][j]==0) continue;
if(f[i][k]==f[k+1][j]){
f[i][j]=f[i][k]+1;
ans=max(ans,f[i][j]);
break;
}
}
}
cout << ans;
}
20分
我不是要你把那个循环删了吗
哪个?
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
f[i][j]=max(f[i][j-1],s[j]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
f[i][j]=max(f[i][j-1],s[j]);
不应该是i+len-1<=n吗
对啊,能不能看仔细点(
AC了,谢谢给大佬好了doge
给你了,桑
嗯,好