一句話題意:
給你一個序列,對每一個數字你可以選擇打或者不打,當打的次數為偶數時,獎勵翻1倍(2*ai),奇數時1倍(ai),不打獎勵為0。求最大得分。
我真的傻叉了。。。第二維表示奇偶性f[][],而我一開始表示當前位置打不打。。。
#include<bitsstdc++.h>
#include<climits>
#define int long long
using namespace std;
int n, a[200005], g[200005][3],f[200005][3];
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n; for(int i = 1; i <= n; i++) cin>>a[i];
f[0][0] = 0;
f[0][1] = LONG_LONG_MIN;
for(int i = 1; i <= n; i++) {
f[i][1] = max (f[i - 1][1], f[i - 1][0] + a[i]);
f[i][0] = max (f[i - 1][0], f[i - 1][1] + a[i] * 2);
}
cout<<max(f[n][0], f[n][1])<<endl;
return 0;
}
以下是我s的程式碼
// for(int i = 1; i <= n; i++){
// if(g[i-1][1] % 2 == 1){//ji
// if(f[i-1][1] + 2 * a[i] > f[i][1]){
// f[i][1] = f[i-1][1] + 2 * a[i];
// g[i][1] = g[i-1][1] + 1;
// }
// if(f[i-1][1] > f[i][0]){
// f[i][0] = f[i-1][1];
// g[i][0] = g[i-1][1];
// }
// }
// if(g[i-1][1] % 2 == 0){//ou
// if(f[i-1][1] + a[i] > f[i][1]){
// f[i][1] = f[i-1][1] + a[i];
// g[i][1] = g[i-1][1] + 1;
// }
// if(f[i-1][1] > f[i][0]){
// f[i][0] = f[i-1][1];
// g[i][0] = g[i-1][0];
// }
// }
// if(g[i-1][0] % 2 == 1){//上一個沒打,到i-1是奇數
// if(f[i-1][0] + 2 * a[i] > f[i][1]){
// f[i][1] = f[i-1][0] + 2 * a[i];
// g[i][1] = g[i-1][0] + 1;
// }
// if(f[i-1][0] > f[i][0]){
// f[i][0] = f[i-1][0];
// g[i][0] = g[i-1][0];
// }
// }
// if(g[i-1][0] % 2 == 0){//上一個沒打,到i-1是偶數
// if(f[i-1][0] + a[i] > f[i][1]){
// f[i][1] = f[i-1][0] + a[i];
// g[i][1] = g[i-1][0] + 1;
// }
// if(f[i-1][0] > f[i][0]){
// f[i][0] = f[i-1][0];
// g[i][0] = g[i-1][0];
// }
// }
// }
// cout<<f[4][0]<<endl;
// cout<<g[4][0]<<endl;