1. 程式人生 > >bzoj1218: [HNOI2003]激光炸彈(DP二維前綴和)

bzoj1218: [HNOI2003]激光炸彈(DP二維前綴和)

clas body http 矩陣 amp get cstring using str

1218: [HNOI2003]激光炸彈

題目:傳送門


題解:

   一道經典題目啊...

   為了更好的操作...把整個坐標系向右上角移動,從(1,1)開始

   那麽f[i][j]統計一下以(i,j)作為右上角,以(1,1)作為左下角所組成的矩陣裏面的價值和

   不難發現,爆炸範圍為R*R,且剛好在邊上的點不會被摧毀,那麽有效矩陣的四條邊上肯定就只有R個點

   那麽ans=max(ans,f[i][j]+f[i-r][j-r]-f[i][j-r]-f[i-r][j]);


代碼:

 1 #include<cstdio>
 2 #include<cstring>
 3
#include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int f[5100][5100]; 8 int main() 9 { 10 memset(f,0,sizeof(f)); 11 int n,r,x,y,v;scanf("%d%d",&n,&r); 12 for(int i=1;i<=n;i++)scanf("%d%d%d",&x,&y,&v),f[x+1
][y+1]+=v; 13 for(int i=1;i<=5001;i++) 14 for(int j=1;j<=5001;j++)f[i][j]+=f[i-1][j]; 15 for(int i=1;i<=5001;i++) 16 for(int j=1;j<=5001;j++)f[i][j]+=f[i][j-1]; 17 int ans=0; 18 for(int i=r;i<=5001;i++)for(int j=r;j<=5001;j++) 19 ans=max(ans,f[i][j]+f[i-r][j-r]-f[i][j-r]-f[i-r][j]);
20 printf("%d\n",ans); 21 return 0; 22 }

bzoj1218: [HNOI2003]激光炸彈(DP二維前綴和)