东华大学2020年程序设计竞赛(同步赛) G Gaming with Mia

微笑、不失礼 提交于 2020-08-20 07:30:50

 G Gaming with Mia

思路:我们能找出某些情况:

-1 1 -1 

-1 1 1 -1

-1 1 1 1 -1

-1 1 ... 1 -1

我们发现如果大于5个数相乘,则它一定可以分解成其他更优的情况相乘再相加。(当然如果出现0,也可以最极限情况5个数相乘)

时间复杂度就是:O(1e6*10*5)

那么我们就可以进行dp,例如:

dp[5] = dp[4] + a[5];

dp[5] = dp[3] + a[5] * a[4];

dp[5] = dp[2] + a[5] * a[4] * a[3];

dp[5] = dp[1] + a[5] * a[4] * a[3] * a[2];

dp[5] = dp[0] + a[5] * a[4] * a[3] * a[2] * a[1]。

总共五种情况,然后取max。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 #define ll long long
 9 
10 const int INF = 1e9;
11 
12 void solve(){
13     
14     int T;
15     scanf("%d", &T);
16     while(T--){
17         int n;
18         scanf("%d", &n);
19         
20         vector<int > a(n + 10);
21         vector<int > dp(n + 10, -INF);
22         for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
23         dp[0] = 0;
24         for(int i = 1; i <= n; ++i){
25             int x = 1;
26             for(int j = 1; j <= 5; ++j){
27                 if(i - j < 0) continue;
28                 x *= a[i - j + 1];
29                 dp[i] = max(dp[i], dp[i - j] + x);
30             }
31         }
32         //printf("ans = %d\n", dp[n]);
33         printf("%d\n", dp[n]);
34     }
35 }
36 
37 int main(){
38     
39     solve();
40     
41     return 0;
42 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!