大盗阿福
题意:有n家商店,抢劫第i家可以获得w[i],但不能抢劫相邻两家
思路: 对于每家店,可以选择抢或不抢,
表示不抢劫第i家,
表示抢劫第i家
可以由
和
转移而来
由于不能抢劫相邻两家,所以
只能由
转移而来
注意:初始状态只能从最初未开始抢劫的状态开始转移,即只能从
开始转移
int f[N][2];
int dp(){
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][1]);
f[i][1]=f[i-1][0]+w[i];
}
return max(f[n][0],f[n][1]);
}
股票买卖 IV
题意:可以在第i天买入/卖出股票,买入和卖出看作一次交易,最多k次交易
表示第i天时,完成了j次交易,且此时未买入
表示第i天时,完成了j次交易,且此时拥有股票
可以由
和
转移而来
可以由
和
转移而来
转移方程:
注意:①初始状态只能由最初未开始交易时的状态转移,即
②当未发生交易,即
,只能从上一次未发生交易,即
转移
int f[N][105][2];
//f[i][j][0/1]
//第i天 完成了j次交易 买了/没买
int dp(){
memset(f,-0x3f,sizeof f);
f[0][0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=k;j++){
if(j){
f[i][j][0]=max(f[i-1][j][0],f[i-1][j-1][1]+w[i]);
}else{
f[i][j][0]=f[i-1][j][0];
}
f[i][j][1]=max(f[i-1][j][1],f[i-1][j][0]-w[i]);
}
}
int res=0;
for(int i=1;i<=k;i++){
res=max(res,f[n][i][0]);
}
return res;
}
股票买卖 V
题意:每次卖出股票后,有1天的冷却期
表示第i天 处于 未买/持仓/冷却状态
转移方程:
注意:初始状态只能从未开始交易,即
时开始转移
int f[N][3];
//f[i][0/1/2]
//第i天 未买/持仓/冷却
int dp(){
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]-w[i]);
f[i][2]=f[i-1][1]+w[i];
}
int res=0;
for(int i=1;i<=n;i++){
res=max(res,f[i][0]);
res=max(res,f[i][2]);
}
return res;
}