BUCT-OJ 2052 数字三角形2

来源:互联网 发布:知无涯者经典语录 编辑:程序博客网 时间:2024/04/27 14:10

【题目来源】:TYVJ 1076

【题目链接】:点击打开链接

 

【解题思路】:

刚开始没想到思路,想到暴力穷举会超时,就乖乖的使用动态规划,但怎么使用想的一团,晕了,

真正独立做起题目来感觉动态规划还没入门的样子,就又重新从最基础的一点点向上想,首先动态规划最起码得有状态吧,

那对应与每一个权值的状态是什么?感觉有很多种情况,没办法了,我穷举所有状态还不行吗,突然发现是mod100的,那一

个权值最多就是100种情况了, 最多25行(1+2+...+25)*100=32500种情况,完全可以穷举。所以开一个三位数组arr[26][26][101],问题得解。

 

A C代码】:

#include <iostream> #include <cstring> #include <cstdio> using namespace std;   int arr[26][26]; int flag[26][26][101]; int main() {     int n, i, j, k;     while(~scanf("%d", &n))     {         memset(arr, 0, sizeof(arr));         memset(flag, 0, sizeof(flag));         for(i = 1; i <= n; i++)             for(j = 1; j <= i; j++)                 scanf("%d", &arr[i][j]);                           flag[1][1][arr[1][1] % 100] = 1;         for(i = 2; i <= n; i++)         {             for(j = 1; j <= i; j++)             {                 for(k = 0; k < 100; k++)                 {                     if(flag[i-1][j-1][k])                          flag[i][j][(k + arr[i][j]) % 100] = 1;                     if(flag[i-1][j][k])                          flag[i][j][(k + arr[i][j]) % 100] = 1;                   }             }         }         int ans = -1;         for(j = 1; j <= n; j++)             for(k = 0; k < 100; k++)                 if(flag[n][j][k])                  {                     if(k > ans) ans = k;                 }         printf("%d\n", ans);             } }