【问题标题】:How to apply Dynamic Programming in SPOJ Feynman?如何在 SPOJ Feynman 中应用动态规划?
【发布时间】:2013-08-09 16:24:28
【问题描述】:

我正在解决这个问题 -> http://www.spoj.com/problems/SAMER08F/(一个非常简单的问题)...我第一次使用 AC...我的解决方案是这样的(非常简单):

#include<iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
    while(n!=0)
    {
    printf("%d",((n)*(n+1)*((2*n)+1))/6);
    printf("\n");
    scanf("%d",&n);
    }
    return 0;
}

我正在浏览此列表http://ahmed-aly.com/Category.jsp?ID=33,发现费曼被列为 DP 问题...我是 DP 的初学者,无法弄清楚这个问题如何由子问题组成。寻找递归关系的任何帮助或提示都会非常有帮助。

【问题讨论】:

    标签: c++ algorithm dynamic-programming divide-and-conquer


    【解决方案1】:

    这只是一个愚蠢的DP。
    你在这里做的是 对吗?
    相反,您可以做的是创建一个数组来保存平方和(我们称之为 sumSquares)。现在,这就是填充数组的方式:

    1. sumSquares[0] = 0; (基本情况,第一个平方和 零元素为零)。

    2. sumSquares[i] = sumSquares[i - 1] + (平方和 i 个元素的平方和是 (i - 1) 个元素的平方和 + ith 的平方 元素)

    就是这样!您迭代直到 n,并且您的答案存储在 sumSquares[n] !

    【讨论】:

    • 这个答案没有说清楚为什么您可以将 i^2 添加到以前的答案中以获得新的答案。
    • @j_random_hacker 哦,对不起,有什么建议可以clear吗?
    • 恐怕我不知道为什么你给出的公式有效——在这个阶段,这对我来说是个谜。我会尝试基于以下事实制作一个 DP ,沿右下边缘的 2*i-1 个可能的 size-1 正方形之一,或者通过取一个 (i-1)*(i-1) 正方形的子正方形创建的正方形,该正方形与它的右侧和/ 或底部边缘,并将其向右和向下扩展 1。
    【解决方案2】:

    只需使用简单的 DP。如果您观察该模式,您会注意到,如果您取 1 个正方形,则可以制作 64 个正方形。如果您采用 2 大小的正方形,则可以制作 (8-1) = 7*7 = 49 大小的正方形。 所以你可以按照 -> (8*8) + (7*7) + ........+(1*1)

    int feyn[1000];
     long long Feynman(long long x)
     {
    if(x==1)return 1 ;
    
    feyn[x]= (x*x)+Feynman(x-1);
    
    return feyn[x];
    
     }
    

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多