洛谷p3800:Power收集
阿新 • • 發佈:2017-09-20
mat 轉移 ++ long long class mic sans amp alt
考慮樸素的dp:
對於每一行的每一個點 枚舉能到的所有點(類似bzoj1648 比這題簡單的dp)
期望時間復雜度O(NMT)
顯然是超時做法
那麽我們發現只有k個點對答案有貢獻 考慮對每一個有權值的點以x為關鍵字排序
容易看出 對於每個點前面的所有點,只要有abs(yi-yj)<=t*abs(xi-xj)
那麽就可以從j轉移到i
掃一遍即可 期望復雜度O(K2)
--------------其實和打鼴鼠差不多的題,只是自己打的時候想的是usaco的那道...我真是弱不可言orz-----------------
#pragma GCC optimize("O2") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<set> #include<map> #include<limits.h> #include<ctime> #define N 100001 typedef long long ll; const int inf=0x3fffffff; const int maxn=4017; using namespace std; inline int read() { int f=1,x=0;char ch=getchar(); while(ch>‘9‘|ch<‘0‘) { if(ch==‘-‘) f=-1; ch=getchar(); } while(ch<=‘9‘&&ch>=‘0‘) { x=(x<<3)+(x<<1)+ch-‘0‘; ch=getchar(); } return f*x; } struct tsdl{ int x,y,w,dp; }a[N]; bool cmp(tsdl a,tsdl b) { return a.x<=b.x; } int main() { int n=read(),m=read(),k=read(),t=read(); for(int i=1;i<=k;i++) { a[i].x=read(),a[i].y=read(),a[i].w=read(); } sort(a+1,a+n+1,cmp); a[1].dp=a[1] for(int i=1;i<=k;i++) { for(int j=1;j<i;j++) { if(abs(a[i].y-a[j].y)<=t*abs(a[i].x-a[j].x)) a[i].dp=max(a[i].dp,a[j].dp+a[i].w); } } int ans=0; for(int i=1;i<=k;i++) { ans=max(ans,a[i].dp); } cout<<ans; }
洛谷p3800:Power收集