EOJ 1824 Solution Report - 数塔 III

原创 2014年04月15日 17:09:48

原文地址:http://linus-young.github.io/blog/2014/04/15/eoj-1824-solution-report-shu-ta-iii/


原题:EOJ 1824

1. 题目描述:

一个正整数组成的三角形,第一行只有一个数, 除了最底行之外每个数的左下方和右下方各有一个数。如下图

    1

  3   2

 4  10  1

4  3   2  20

从第一行的数开始, 每次都只能左下或右下走一格, 直到走到最下行, 将沿途经过的数加起来,求和的个位数最大是多少。

Note:

1N500,N 表

每行的数范围是 [0,99]

2. 解题思路

本题不满足最优子结构(两个数的个位数字之和可能为两位数),因为和的个位数字只可能是 0 - 9 其中的一个,改用如下状态定义:

d[i][j][k] 表示以 (i, j) 为根的子三角形的所有数之和的个位数若有为 k 的路径则取值为1, 否则取值为0(其中 k 为 0-9 )

则解为满足 d[1][1][k] = 1 的最大 k 值。

初始数组 d 全部为 0, 从最底下一层开始算起,根据个位数字模 10 的情况,设置数组某些位为 1。 然后从下往上往左往右加,只需注意个位数字相加后模 10 即可,设置对应位为 1。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//
//  main.cpp
//  eoj1824
//
//  Created by whyisyoung on 3/26/14.
//  Copyright (c) 2014 whyisyoung. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 102;

int a[maxn][maxn]; // the original tower

// d[i][j][k] 表示以 (i, j) 为根的子三角形的所有数之和的个位数若有为 k 的路径则取值为1, 否则取值为0(其中 k 为 0-9 )
int d[maxn][maxn][10];

int solve(int n)
{
    memset(d, 0, sizeof(d));

    for(int i = 1; i <= n; ++i) {
    	d[n][i][a[n][i] % 10] = 1;
    }

    for(int i = n; i >= 1; --i) {
    	for(int j = 1; j <= i; ++j) {
    		for( int k = 0; k <= 9; ++k) {
    			if(d[i][j][k]) {
    				d[i - 1][j - 1][(k + a[i - 1][j - 1] % 10)] = 1;
    				d[i - 1][j][(k + a[i - 1][j]) % 10] = 1;
    			}
    		}
    	}
    }

    int ans = 0;
    for(int k = 1; k <= 9; ++k) {
    	if(d[1][1][k]) {
    		if(k > ans)
    			ans = k;
    	}
    }

    return ans;
}

int main()
{
    int C, N;
    scanf("%d", &C);
    while(C--) {
		scanf("%d", &N);

		memset(a, 0, sizeof(a));

		for(int i = 1; i <= N; ++i) {
		    for(int j = 1; j <= i; ++j) {
                scanf("%d", &a[i][j]);
		    }
		}

		cout << solve(N) << endl;
    }
    return 0;
}

EOJ 1488 Solution Report - Coin Collector

原文地址:http://linus-young.github.io/blog/2014/04/15/eoj-1488-solution-report-coin-collector/ ...

EOJ 1852 Solution Report --Ordered Fractions

本文提供了3种比较简单的Feray数列输出方法。 即:给定一个数 N , 从小到大列出 0 到 1 之间 分母不超过 N 的最简真分数,包括 0/1, 1/1...

EOJ 2067 Solution Report - Building Roads

原文地址:http://linus-young.github.io/blog/2014/04/15/eoj-2067-solution-report-building-roads/ ...

EOJ 1855 Solution Report - Expedition

原文地址:http://linus-young.github.io/blog/2014/04/15/eoj-1855-solution-report-expedition/ keyw...

EOJ 1824 【动态规划】

/*题目链接*/ 题意:有一个由正整数组成的三角形,如下: 1       2   3     4   5   6   7   8   9   10       .....    ...

Eoj 2854 统计包含m个连续1子串的字符串的个数

统计特定字串模式的个数 Time Limit:1000MS Memory Limit:65536KB Total Submit:321 Accepted:173Description 在0和1组成...
  • fawks96
  • fawks96
  • 2017年03月02日 01:55
  • 502

Codeforces Round #383 (Div. 2) B. Arpa’s obvious problem and Mehrdad’s terrible solution 数论、易错

题意:找出多少组ai和aj 使 ai ^ aj == x. 数论、易错 ai ^ aj == x. => ai ^ x == aj 这样把sz[ai] 为数ai出现的次数,对于每个ai,a...

Report Viewer 每頁固定筆數

轉載: 寫一下最近的新試報表功能── Report Viewer裡如何在每頁指定固定顯示筆數及非頁首頁尾仍能重覆顯示特定欄位或文字方塊,這樣的做法可以產出像出貨單那樣的報表格式,或需要套表的列印需...

Visual assist1824

  • 2011年04月01日 18:08
  • 12.65MB
  • 下载

HDU 1824 2-sat算法

分析:这题就是2-sat的模板题,首先
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EOJ 1824 Solution Report - 数塔 III
举报原因:
原因补充:

(最多只允许输入30个字)