P3558 [POI2013]BAJ-Bytecomputer题解
题型考察
此题是经典的最优解问题,考虑贪心或
在序列上首先考虑线性
思路
首先按照常规思路,
处理边界值,作为数组的第一个数,无论怎么对数组中的数字进行操作,
dp[1][0]=dp[1][1]=dp[1][2]=inf;
dp[1][a[1]+1]=0;
考虑状态转移方程。作为
当
//cmin(a,b,c)=min(a,min(b,c))
dp[i][0]=dp[i-1][0];//不需要有转移代价+遵循单调不降(dp[i][1]与dp[i][2]便不参与本次转移)
if(a[i-1]==1) dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1;//此时转移代价为1次+遵循单调不降(dp[i][2]便不参与本次转移)
else dp[i][1]=inf;//此时无法转移
if(a[i-1]==1) dp[i][2]=cmin(dp[i-1][0],dp[i-1][1],dp[i-1][2])+2;//此时转移代价为2次+遵循单调不降(统统参与本次转移)
else dp[i][2]=dp[i-1][2]+2;//此时转移代价为2次+遵循单调不降(特殊条件,dp[i][0]与dp[i][1]便不参与本次转移)
按照此思路,同理可得。
当
dp[i][0]=dp[i-1][0]+1;
dp[i][1]=min(dp[i-1][0],dp[i-1][1]);
if(a[i-1]==1) dp[i][2]=cmin(dp[i-1][0],dp[i-1][1],dp[i-1][2])+1;
else dp[i][2]=dp[i-1][2]+1;
当
dp[i][0]=dp[i-1][0]+2;
if(a[i-1]==-1) dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1;
else dp[i][1]=dp[i-1][0]+1;
dp[i][2]=cmin(dp[i-1][0],dp[i-1][1],dp[i-1][2]);
此刻状态转移方程结束。
目标状态,对于此题,可以发现答案为
ans=cmin(dp[n][0],dp[n][1],dp[n][2]);
另外如果
代码实现
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000010;
const int inf=1e9;
int n,ans;
int a[N],dp[N][3];
int cmin(int x,int y,int z) {
return min(x,min(y,z));
}
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];
dp[1][0]=dp[1][1]=dp[1][2]=inf;
dp[1][a[1]+1]=0;
for(int i=2;i<=n;i++) {
if(a[i]==-1) {
dp[i][0]=dp[i-1][0];
if(a[i-1]==1) dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1;
else dp[i][1]=inf;
if(a[i-1]==1) dp[i][2]=cmin(dp[i-1][0],dp[i-1][1],dp[i-1][2])+2;
else dp[i][2]=dp[i-1][2]+2;
}
else if(a[i]==0) {
dp[i][0]=dp[i-1][0]+1;
dp[i][1]=min(dp[i-1][0],dp[i-1][1]);
if(a[i-1]==1) dp[i][2]=cmin(dp[i-1][0],dp[i-1][1],dp[i-1][2])+1;
else dp[i][2]=dp[i-1][2]+1;
}
else {
dp[i][0]=dp[i-1][0]+2;
if(a[i-1]==-1) dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1;
else dp[i][1]=dp[i-1][0]+1;
dp[i][2]=cmin(dp[i-1][0],dp[i-1][1],dp[i-1][2]);
}
}
ans=cmin(dp[n][0],dp[n][1],dp[n][2]);
if(ans>=inf) cout<<"BRAK";
else cout<<ans;
return 0;
}
本文作者:2021hych
本文链接:https://www.cnblogs.com/2021hych/p/16500211.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步