hdu - 1176 - 免费馅饼

题意:0到10共11个位置,每秒有馅饼落下,gameboy在接,开始在位置5,每秒能移到一位,问最后gameboy能接住多少个。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176

——>>设d[i][j]表示他第i秒在第j个位置所能接到的最大馅饼数(不加上第i秒之前的),递推即可。

当日的C++:

#include <iostream>
#include <string.h>
#include <cmath>

using namespace std;

const int maxn = 100000 + 10;
int num[maxn][12], d[maxn][12];

int main()
{
    int n, x, T, i, j;
    while(cin>>n)
    {
        if(!n) return 0;
        memset(num, 0, sizeof(num));
        memset(d, 0, sizeof(d));
        int max_t = -1;
        for(i = 0; i < n; i++)
        {
            cin>>x>>T;
            num[T][x]++;
            max_t = max(max_t, T);
        }
        for(i = 0; i <= 10; i++)
            d[max_t][i] = num[max_t][i];
        for(i = max_t-1; i >= 0; i--)
            for(j = 0; j <= 10; j++)
            {
                if(j == 0) d[i][j] = max(d[i+1][j], d[i+1][j+1]) + num[i][j];
                else if(j == 10) d[i][j] = max(d[i+1][j], d[i+1][j-1]) + num[i][j];
                else
                {
                    d[i][j] = max(d[i+1][j], d[i+1][j+1]) + num[i][j];
                    d[i][j] = max(d[i][j], d[i+1][j-1]+num[i][j]);
                }
            }
        cout<<d[0][5]<<endl;
    }
    return 0;
}

今天用的Java:

好多好多次忘记初始化数组,这次还是一样…………还要WA一次才AC……

import java.util.Scanner;
import java.lang.Math;
public class Main {
	static final int maxn = 100000 + 10;
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n, d[][] = new int[maxn][15], a[][] = new int[maxn][15];
		while(cin.hasNextInt()){
			n = cin.nextInt();
			if(n == 0) break;
			for(int i = 0; i < maxn; i++)
				for(int j = 0; j < 15; j++)
					a[i][j] = 0;
			int time = -1;
			for(int i = 1; i <= n; i++){
				int x = cin.nextInt();
				int T = cin.nextInt();
				a[T][x]++;
				if(T > time) time = T;
			}
			for(int i = 0; i <= 10; i++) d[time][i] = a[time][i];
			for(int i = time-1; i >= 0; i--)
				for(int j = 0; j <= 10; j++){
					if(j == 0) d[i][j] = Math.max(d[i+1][j], d[i+1][j+1]) + a[i][j];
					else if(j == 10) d[i][j] = Math.max(d[i+1][j], d[i+1][j-1]) + a[i][j];
					else{
						d[i][j] = Math.max(d[i+1][j], d[i+1][j+1]) + a[i][j];
						d[i][j] = Math.max(d[i][j], d[i+1][j-1]+a[i][j]);
					}
				}
			System.out.println(d[0][5]);
		}
		cin.close();
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值