开始的思路:
试图写三维状态
f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k], i i i表示第几天, j j j表示手中有货还是无货, k k k表示是否为冷却期
我可能写得三维代码的状态冗余了
错误思路代码(三维)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int f[N][2][2];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
memset(f,-0x3f,sizeof(f));
for(int i = 0; i <=n; i++){
f[i][0][0] = 0;
}
for(int i = 1; i <= n; i++){
f[i][1][0] = max(f[i-1][0][0] - a[i],f[i-1][1][0]);
f[i][0][0] = max(f[i - 1][0][1],f[i-1][0][0]);
f[i][0][1] = max(f[i-1][1][0] + a[i],f[i-1][0][1]);
}
// for(int i = 1; i <= n; i++){
// f[i][1] = max(f[i - 1][0] - a[i],f[i-1][1]);
//
// f[i][0] = max(f[i - 1][2] ,f[i - 1][0]);
// f[i][2] = max(f[i - 1][0] + a[i], f[i - 1][0]);
// }
int res = 0;
cout << f[n][0][0] << endl;
return 0;
}
正确思路
手中有货状态无变化
将手中无货分为两个状态:
1.冷却期(手中无货的第一天)
2.可买入期(手中无货的第>=2天),可选择买或不买
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
int f[N][3];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
memset(f,-0x3f,sizeof(f));
f[0][0] = 0;
for(int i = 1; i <= n; i++){
f[i][0] = max(f[i - 1][0],f[i - 1][2]);
f[i][1] = max(f[i - 1][1],f[i - 1][0] - a[i]);
f[i][2] = f[i - 1][1] + a[i];
}
printf("%d",max(f[n][0],f[n][2]));//因存在一次交易也不做的情况,数据单调下降,所以要考虑两个出口。
return 0;
}