标签:
题意:在一条 0 ~ 10 的坐标轴上,在整数点上会掉烙饼,一个人第 0 秒站在坐标 5 处,每秒他能够左右移动一个单位的坐标或不移动,并接住该坐标位置当前时间落下的烙饼,(例如第0秒他在坐标5处,第一秒他能在坐标4或5或6处,并接到该点第一秒落下的饼,同一个点同一秒可以落下多个饼),问最多能够接到多少饼
我的做法是以 dp [ i ] [ j ] 表示在坐标 i 处第 j 秒能接到的饼的最优情况。转移时由上一秒种能够移动到 i 点的最大 dp 值转移过来,并且加上当前能够拿到的最大值(这是我的第一思路,但事实上题目描述并不是这样,他只能捡到他移动到的点当前时间掉落的烙饼,而我以为可以捡到左中右三格上最大的一格,所以orzWA五连发```)。
dp[ i ] [ j ] = max ( dp [ i - 1 ] [ j - 1 ] , dp [ i ] [ j - 1 ] , dp [ i + 1 ] [ j - 1 ] ) + a [ i ] [ j ];当然, i + 1, i - 1 都必须保证在 0 ~ 10 范围内且第 j - 1 秒是能够达到的。
当然,我看其他人的题解其实都是从最后一秒向第 0 秒推,我看完之后也觉得可能比我的做法更加优化,因为这样就不需要考虑那一秒的时候是否能够达到那个点了。
自己还是太弱了,中问题都看不懂了啊!
1 #include<stdio.h> 2 #include<string.h> 3 #define max(a,b) a>b?a:b 4 5 int a[11][110000],dp[12][110000]; 6 7 int main(){ 8 int n; 9 while(scanf("%d",&n)!=EOF&&n!=0){ 10 memset(a,0,sizeof(a)); 11 memset(dp,-1,sizeof(dp)); 12 int i,j,x,t,m=0,k,ans=0; 13 for (i=1;i<=n;i++){ 14 scanf("%d%d",&x,&t); 15 a[x][t]++; 16 if(t>m)m=t; 17 } 18 dp[5][0]=a[5][0]; 19 ans=max(ans,dp[5][0]); 20 /* dp[5][1]=max(a[5][1],a[4][1]); 21 dp[5][1]=max(dp[5][1],a[6][1]); 22 ans=dp[5][1]; 23 dp[5][1]=dp[5][0]; 24 dp[5][1]+=a[5][1]; 25 ans=max(dp[5][1],ans); 26 */ for(t=1;t<=m;t++){ 27 for(i=0;i<=10;i++){ 28 for(j=i-1;j<=i+1;j++){ 29 if(0<=j&&j<=10&&dp[j][t-1]>=0){ 30 dp[i][t]=max(dp[i][t],dp[j][t-1]); 31 } 32 } 33 /* int m0=0; 34 for(j=i-1;j<=i+1;j++){ 35 if(0<=j&&j<=10){ 36 m0=max(m0,a[j][t]); 37 } 38 } 39 */ if(dp[i][t]>=0){ 40 /* int m0=0; 41 for(j=i-1;j<=i+1;j++){ 42 if(0<=j&&j<=10){ 43 m0=max(m0,a[j][t]); 44 } 45 }*/ 46 dp[i][t]+=a[i][t]; 47 } 48 // dp[i][t]+=m0; 49 ans=max(ans,dp[i][t]); 50 } 51 } 52 printf("%d\n",ans); 53 } 54 return 0; 55 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4293455.html