如何在SPOJ Feynman中应用动态编程?

时间:2013-08-08 04:21:43

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

我正在解决这个问题 - > 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,我发现Feynman被列为DP问题......我是DP的初学者,无法弄清楚这个问题如何由子问题组成。找到复发关系的任何帮助或提示都将非常有用。

2 个答案:

答案 0 :(得分:1)

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

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

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

  3. 就是这样!你迭代到n,你的答案存储在sumSquares [n]!

答案 1 :(得分: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];

 }