248 G——區間dp
阿新 • • 發佈:2022-04-05
P3146 [USACO16OPEN]248 G - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
兩個亮點。
亮點1:初始化的時候,要考慮到如果區間內只有這一個數,那我們求得的最大值就應該是這個數本身,所以初始化f[i][i]=a[i]
亮點2:答案不一定是f[1][n],因為不一定能把所有區間都聯通,我們應該在求每一大區間的時候取max,ans=max(ans,f[i][j])
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=300; 4 int a[N],f[N][N];View Code5 6 int main() 7 { 8 int n;scanf("%d",&n); 9 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 10 11 for(int i=1;i<=n;i++)f[i][i]=a[i]; 12 int ans=0; 13 for(int len=1;len<=n;len++) 14 { 15 for(int i=1;i+len-1<=n;i++) 16 { 17 int j=len+i-1; 18 for(int k=i;k<j;k++) 19 { 20 if(f[i][k]==f[k+1][j]&&f[i][k]) 21 f[i][j]=max(f[i][j],f[i][k]+1); 22 } 23 ans=max(ans,f[i][j]); 24 } 25 } 26 27 printf("%d\n",ans); 28 29 30 return0; 31 }