这是一道有趣的dp题
d[i]:前i堆草最多可以吃几堆
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; int e,d[6000010],to1[1500020],next1[1500020],begin1[3000020]; int add(int x,int y){//用存图的方式存每个终点对应的起点 to1[++e]=y; next1[e]=begin1[x]; begin1[x]=e; } int main(){ int i,j,k,m,x,y,n,maxy=0; scanf("%d",&n); for(i=1;i<=n;i++){//输入 scanf("%d%d",&x,&y); add(y,x); maxy=max(y,maxy); } d[0]=0; for(i=0;i<=maxy;i++){//dp if(i)d[i]=d[i-1]; for(j=begin1[i];j;j=next1[j])//枚举i前的每一堆+从to1[i]到i的堆数 d[i]=max(d[i],i-to1[j]+1+d[max(0,to1[j]-1)]); } printf("%d\n",d[maxy]);//输出 return 0; }