我今天脑子貌似又好使了一点,可以做一做DP中的水题了。
这个题难度蓝色,纯属是做的人太少了虚高。
这个题很显然的是可以用一个顺序一个逆序这两个大水转移方程轻松转移出到达这个地方最少需要的棋子数量,然后因为n足够小,直接枚举每一个偶数坐标,对于可以由红色棋子走到的,就把总数++,不可以的,就把一开始要放得棋子++。。。
然而交了好几遍,最后,最后三个点老是不对,我突然觉得是不是数据太大了,比较符号反了。。。。结果。。。R少打了一个0.。。。。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define re register #define maxn 1000007 #define ll long long using namespace std; ll f[20001],a[20001],d,n,m,ans,sum; int main() { cin>>n; memset(f,10,sizeof(f)); cin>>d; for(re int i=2;i<=n;i++) { cin>>d; if(d) f[i]=1; } for(re int i=2;i<=n;i++) { f[i]=min(f[i],f[i-1]+f[i-2]); } for(re int i=n;i>=1;i--) { f[i]=min(f[i+1]+f[i+2],f[i]); } for(re int i=1;i<=n;i++) { if(i%2==0) { if(f[i]>1000000000000000) ans++; else sum+=f[i]; } } cout<<ans<<endl<<sum; }