我正在解决这个问题 - > 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的初学者,无法弄清楚这个问题如何由子问题组成。找到复发关系的任何帮助或提示都将非常有用。
答案 0 :(得分:1)
这只是一个愚蠢的DP。
你在这里做的是对吗?
相反,你可以做的是创建一个数组来保持平方和(让我们称之为sumSquares)。现在,这就是你填充数组的方式:
sumSquares [0] = 0; (基本情况,第一个的平方和 零元素为零)。
sumSquares [i] = sumSquares [i - 1] + (平方和 of i 元素是(i - 1)元素的平方和+ ith 的平方 元件)
就是这样!你迭代到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];
}