1

我正在解决这个问题-> 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 的初学者,无法弄清楚这个问题是如何构成的的子问题。寻找递归关系的任何帮助或提示都将非常有帮助。

4

2 回答 2

1

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

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

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

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

于 2013-08-08T06:19:38.327 回答
0

只需使用简单的 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];

 }
于 2020-05-31T20:46:00.697 回答