poj 3671 Dining Cows(dp)


 枚举每个位置,如果与这个位置为分界点,那么要修改多少个card。

#include<algorithm>
#include<iostream>
#include<stdio.h>
bool card[30002];//card[i]=0表示1,card[i]=1表示2;
int cow[30002][2];//cow[i]:表示1---i为1,i+1---n为2;cow[i][0],表示1---i要修改的卡片数,cow[i][1]:表示i+1要修改的卡片数。
int main()
{
 int n,min=0,cn_1=0,cn_2=0;//cn_1表示n张卡片中1的个数,cn_2表示n张卡片中2的个数;
 int i,x;
 scanf("%d",&n);
 for(i=1;i<=n;i++)
 {
  scanf("%d",&x);
  
  if(x==1)
  {
   cn_1++;
   card[i]=0;
  }
  else
   card[i]=1;
 }
 cn_2=n-cn_1;
 cow[0][0]=0;
 cow[1][1]=cn_1;
 cow[n][0]=cn_2;
 cow[n+1][1]=0;
 min=cn_1;
 for(i=1;i<=n;i++)
  if(card[i]==0)//若卡片上面是1,则1---i要修改的卡片数等于1---i-1要修改的卡片数,i+1---n要修改的卡片数,等于i--n要修改的卡片数-1

  {
   cow[i][0]=cow[i-1][0];
   cow[i+1][1]=cow[i][1]-1;
  }
  else//若卡片上面是2,则1---i要修改的卡片数等于1---i-1要修改的卡片数+1,i+1---n要修改的卡片数,等于i--n要修改的卡片数
  {
   cow[i][0]=cow[i-1][0]+1;
   cow[i+1][1]=cow[i][1];
  }
 for(i=0;i<=n;i++)
  if(min>cow[i][0]+cow[i+1][1])
   min=cow[i][0]+cow[i+1][1];

printf("%d/n",min);

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值