洛谷P2837晚餐队列安排

【洛谷P2837晚餐队列安排】题目中文,不再赘述
思路:我们定义一个数组f[i][j],第二维只有两种情况1/0,表示这位变成1还是2,然后我们考虑一下情况
1.当前位一开始是1,那么考虑两种情况上一位是1,这位不变,那么f[i][0]=f[i-1][0]; 第二种这位变成2,那么转移就是上一位是1还是2的最小值+1,f[i][1]=min(f[i-1][0],f[i-1][1])+1
2,当前位一开始是2,那么考虑上一位是2还是1时取最小,这位不变,那么f[i][1]=min(f[i-1][1],f[i-1][0]); 第二种是上一位是一,这一位变成1,那么f[i][0]=f[i-1][0]+1
代码

#include #include #include #include #include using namespace std; const int M=30050; int n; int now[M]; int f[M][3]; int main() { scanf("%d",&n); for (int i=1; i<=n; i++) scanf("%d",&now[i]); f[1][now[1]-1]=0; f[1][2-now[1]]=1; for (int i=2; i<=n; i++) { if (now[i]==1) { f[i][0]=f[i-1][0]; f[i][1]=min(f[i-1][0],f[i-1][1])+1; } else { f[i][0]=f[i-1][0]+1; f[i][1]=min(f[i-1][0],f[i-1][1]); } } cout<


    推荐阅读