40分dp求助大佬

P1043 [NOIP2003 普及组] 数字游戏

```cpp #include <iostream> #include <cstring> using namespace std; int n,m,minn = 0x3f3f3f3f,maxn; int num[105]; int sum[105]; int f[105][105][105]; int fmaxn[105][105][105]; int dfsmin(int l,int r,int M){ if(f[l][r][M] != -1) return f[l][r][M]; if(M == 1){ f[l][r][M] = (sum[r] - sum[l - 1]) % 10; return f[l][r][M]; } int res = 0x3f3f3f3f; for(int i = l;i < r;i++) for(int j = 1;j < M;j++) res = min(res,dfsmin(l,i,j) * dfsmin(i + 1,r,M - j)); return f[l][r][M] = res; } int dfsmax(int l,int r,int M){ if(fmaxn[l][r][M] != -1) return fmaxn[l][r][M]; if(M == 1){ fmaxn[l][r][M] = (sum[r] - sum[l - 1]) % 10; return fmaxn[l][r][M]; } int res = 0; for(int i = l;i < r;i++) for(int j = 1;j < M;j++) res = max(res,dfsmax(l,i,j) * dfsmax(i + 1,r,M - j)); return fmaxn[l][r][M] = res; } int main(){ memset(f,-1,sizeof f); memset(fmaxn,-1,sizeof fmaxn); cin >> n >> m; for(int i = 1;i <= n;i++){ cin >> num[i]; if(num[i] < 0) num[i] += 100000; num[i + n] = num[i]; } for(int i = 1;i <= 2 * n;i++){ sum[i] = sum[i - 1] + num[i]; } for(int i = 1;i <= n;i++){ minn = min(minn,dfsmin(i,i + n - 1,m)); maxn = max(maxn,dfsmax(i,i + n - 1,m)); } if(minn < 0) minn = 0; cout << minn << endl << maxn; return 0; } ```
by 2012GFKKKZ @ 2023-07-18 17:06:43


|