9.4吉比特笔试情况 + 第三题代码
选择填空都有点耗时,编程第二题题意不清。
调查一下编程题AC情况。
第一题模拟。
第二题题意没懂。
第三题代码存了一下,写的记忆化搜索,其实本质上是区间dp,从小范围到大范围写就好了,一开始瞎写的搜索干脆就将错就错了。
#include <bits/stdc++.h> using namespace std; const int maxn = 105; #define ll long long #define inf 0x3f3f3f3f3f3f3f3f ll a[maxn],dp[maxn][maxn][2],sum[maxn],ans = -inf; //0->A,1->B int cnt = 0; ll dfs(int l,int r,int op) { if(l > r) { return 0; } ll tt = 0; if(op == 0 && dp[l][r][op] != -inf) return dp[l][r][op]; else if(op == 1 && dp[l][r][op] != inf) return dp[l][r][op]; ll mx = -inf,mi = inf; for(int i = l; i <= r; i++) { if(op) tt = -sum[i]+sum[l-1]; else tt = sum[i]-sum[l-1]; ll t = dfs(i+1,r,op^1); mx = max(mx,t+tt); mi = min(mi,t+tt); } for(int i = r; i >= l; i--) { if(op) tt = -sum[r]+sum[i-1]; else tt = sum[r]-sum[i-1]; ll t = dfs(l,i-1,op^1); mx = max(mx,t+tt); mi = min(mi,t+tt); } if(op == 0) dp[l][r][0] = max(dp[l][r][0],mx); else dp[l][r][1] = min(dp[l][r][1],mi); return dp[l][r][op]; } int main() { ios::sync_with_stdio(0); int n; cin>>n; for(int i = 1; i <= n; i++) cin>>a[i]; for(int i = 1; i <= n; i++) sum[i] = sum[i-1]+a[i]; for(int i = 1; i <= n; i++) for(int j = i; j <= n; j++) dp[i][j][0] = -inf,dp[i][j][1] = inf; cout<<dfs(1,n,0); return 0; }