1. 程式人生 > >POJ P2385 [USACO 2004 November] Apple Catching【傻逼DP】

POJ P2385 [USACO 2004 November] Apple Catching【傻逼DP】

傻逼DP。

f[i][j]表示第i分鐘的時候移動了j步的最大蘋果樹。

轉移方程為:

f[i][j]=max(f[i1][j],f[i][j1])+[j%2+1==typei]

其中typei表示第i秒鐘掉下的蘋果來自哪棵樹。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long #define rep(i,x,y) for(ll i=(x);i<=(y);i++) #define repd(i,x,y) for(ll i=(x);i>=(y);i--) using namespace std; const ll N=1e3+5; const ll M=45; ll n,m,ans,f[N][M]; ll tr[N],ty[N],cnt[N]; inline ll read() { ll x=0;char ch=getchar();bool f=0; while(ch>'9'||ch<'0'
){if(ch=='-')f=1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?-x:x; } int main() { // freopen("POJ2385.txt","r",stdin); n=read(),m=read(); rep(i,1,n) tr[i]=read(); if(tr[1]==1) f[1][0]=1; else f[1][1]=1; rep(i,2
,n) rep(j,0,m) { f[i][j]=max(f[i-1][j],f[i][j-1]); if((j&1)+1==tr[i]) f[i][j]++; ans=max(ans,f[i][j]); } printf("%lld",ans); return 0; }