3 条题解
-
2
动态规划即可
#include <bits/stdc++.h> #define R register using namespace std; inline void in(int &x) { int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f; } int n,ans=-2147483644; int l[1000008],r[1000008],x[1000008]; int main() { in(n); for(R int i=1;i<=n;i++)in(x[i]); l[1]=x[1]; for(R int i=2;i<=n;i++) l[i]=max(l[i-1]+x[i],x[i]); for(R int i=2;i<=n;i++) l[i]=max(l[i-1],l[i]); r[n]=x[n]; for(R int i=n-1;i>=1;i--) r[i]=max(r[i+1]+x[i],x[i]); for(R int i=n-1;i>=1;i--) r[i]=max(r[i+1],r[i]); for(R int i=2;i<n;i++) ans=max(ans,r[i+1]+l[i-1]); cout << ans; return 0; }//已AC
-
1
这个题好像跟第一天一样,
虽然花了半个小时暴力过不去了 这类题思路基本统一只不过加了一个两端 记住模型以后这种题必须AC#include <bits/stdc++.h> using namespace std; long long n,f1[1000005],f2[1000005],a[1000005],ans = -1e15,p[1000005],q[1000005]; int main() { cin >> n; for(int i=1; i<= n ;i++) { cin >> a[i]; } f2[n+1]= f1[0] = -1e15; for(int i=1; i<= n ;i++) { f1[i] = max(a[i],f1[i-1]+a[i]);//f1[i] 表示从前开始,以i为结尾,子段的最大值 p[i] = max(f1[i],p[i-1]);//p[i] 表示从前开始,以i为结尾,所有f[j] 1<=j <= i 的最大值。(p f1这俩不一样) } for(int i=n; i>= 1 ;i--) { f2[i] = max(a[i],f2[i+1]+a[i]); q[i] = max(f2[i],q[i-1]);//f2[i] 和 q[i] 同理,聪明如你一定能明白 } for(int i=2; i <= n-1; i++) { ans = max(p[i-1]+q[i+1],ans);//中间至少空一个 } cout << ans; return 0; }
-
0
这是L几讲的内容,完全忘了这题都能和老师对线一个多小时,醉了
类似最长上升子序列
滚去复习了ww完整代码
#include<bits/stdc++.h> using namespace std; long long n , a[ 1000001 ] , f1[ 1000001 ] , f2[ 1000001 ] , ans = 0xc0c0c0c0c0c0c0c0; int main() { ios::sync_with_stdio( 0 ) ; cin.tie( 0 ) ; cin >> n ; for( long long i = 1 ; i <= n ; i ++ ) cin >> a[ i ] ; f1[ 1 ] = a[ 1 ] ; for( long long i = 2 ; i <= n ; i ++ ) { f1[ i ] = max( a[ i ] + f1[ i - 1 ] , a[ i ] ) ; } for( long long i = 2 ; i <= n ; i ++ ) { f1[ i ] = max( f1[ i - 1 ] , f1[ i ] ) ; } f2[ n ] = a[ n ] ; for( long long i = n - 1 ; i >= 1 ; i --) { f2[ i ] = max( a[ i ] + f2[ i + 1 ] , a[ i ] ) ; } for( long long i = n - 1 ; i >= 1 ; i -- ) { f2[ i ] = max( f2[ i + 1 ] , f2[ i ] ) ; } for( long long i = 2 ; i <= n - 1 ; i ++ ) { ans= max( ans , f1[ i - 1 ] + f2[ i + 1 ] ) ; } cout << ans ; return 0; }
- 1
信息
- ID
- 1901
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 118
- 已通过
- 57
- 上传者