T4讨论248求求了

	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分

@郭子路 这个循环是干什么的?

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]);

赋初值

我知道了

你把这个循环删掉,然后下面的区间 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

给你了,桑

不应该给金杭东吗? @郭子路

嗯,好