CF1415D XOR-gun
阿新 • • 發佈:2021-10-11
顯然的轉移,但是會是\(O(n^3)\)的,這很不好
但是可以意識到從不是同一顆樹轉移的時候,無需在意到底是那顆而只在意最大值
並且不會影響從自己轉移
那就記錄一下最大值
#include<iostream> #include<cstdio> #include<vector> #include<queue> #include<cstring> //#define int long long using namespace std; int f[2005][2005]; int pre[2005]; template <class T> T read(T &now){ now=0; T f=0; char c=getchar(); while(!isdigit(c)){ f=(c=='-'); c=getchar(); } while(isdigit(c)){ now=(now<<1)+(now<<3)+c-'0'; c=getchar(); } if(f) now=-now; return now; } int x; int y; int n,h,de; int ex[2005][2005]; int main(){ read(n);read(h);read(de); for(int i=1;i<=n;++i){ read(x); for(int j=1;j<=x;++j){ read(y); ex[i][y]++; } } for(int i=h;i>=0;--i){ for(int j=1;j<=n;++j){ f[i][j]=f[i+1][j]+ex[j][i]; if(i+de<=h){ f[i][j]=max(f[i][j],pre[i+de]+ex[j][i]); } pre[i]=max(pre[i],f[i][j]); } // cout<<pre[i]<<endl; } cout<<pre[0]; return 0; }