1270: [BeijingWc2008]雷濤的小貓
阿新 • • 發佈:2018-11-20
Submit: 1511 Solved: 837
[Submit][Status][Discuss]
Description
雷濤的小貓雷濤同學非常的有愛心,在他的宿舍裡,養著一隻因為受傷被救助的小貓(當然,這樣的行為是違反學 生宿舍管理條例的)。 在他的照顧下,小貓很快恢復了健康,並且愈發的活潑可愛了。可是有一天,雷濤下課回 到寢室,卻發現小貓不見了!經過一番尋找,才發現她正趴在陽臺上對窗外的柿子樹發呆…在北京大學的校園裡,Input
第一行三個整數N,H,Delta 接下來N行,每行一個整數Ni代表第i個樹上柱子的數量 接下來Ni個整數,每個整數Tij代表第i個樹的高度Tij上有一個柿子Output
小貓能吃到多少柿子
Sample Input
3 10 23 1 4 10
6 3 5 9 7 8 9
5 4 5 3 6 9
Sample Output
8 一瞬間想到n^3的動規,然而TLE 利用一個數組維護每層最大,降到n^2 動規方程: \[f[i][j]=max\left \{ s[j+delta],f[i][j+1] \right \}+a[i][j]\]1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int n,h,delta,ans; 7 int a[2050][2050],s[2050],f[2050][2050]; 8 9 int main() 10 { 11 scanf("%d%d%d",&n,&h,&delta); 12 for(int i=1;i<=n;i++) 13 { 14 int ni; 15 scanf("%d",&ni); 16 for(int j=1;j<=ni;j++) 17 { 18 int x; 19 scanf("%d",&x); 20 a[i][x]++; 21 } 22 } 23 for(int j=h;j>=1;j--) 24 for(int i=1;i<=n;i++) 25 { 26 f[i][j]=max(f[i][j],s[j+delta]); 27 f[i][j]=max(f[i][j],f[i][j+1]); 28 f[i][j]+=a[i][j]; 29 s[j]=max(s[j],f[i][j]); 30 } 31 for(int i=1;i<=n;i++) 32 ans=max(ans,f[i][1]); 33 printf("%d\n",ans); 34 return 0; 35 }