您的位置:首页 > 其它

pku 1953 dp World Cup Noise 解题报告

2009-03-19 13:52 489 查看
一、题目:World Cup Noise
二、题意:http://acm.pku.edu.cn/JudgeOnline/problem?id=1953
三、错误解法:即是常规的解法,搜索在数组a中取a[i]与a[i+1]是否相等而且是==1的;
#include "stdio.h"
#include "string.h"
#define MAX 45
int LCS(int a[], int m)
{
int i;
for (i = 0; i < m; i++)
{
if (a[i] == a[i + 1])
{
if (a[i] == 1)
{
return 0;
}
}
}
return 1;
}
int main()
{
freopen("1.txt", "r", stdin);
int i, j;
int n, k, p;
int a[MAX];
int num = 0;
scanf("%d", &n);
for (k = 0; k < n; k++)
{
num++;
int count = 0;
scanf("%d", &i);
for (j = 0; j < i; j++)
{
a[j] = 0;
}
int sum = 2;
j = 1;
while (j < i)
{
sum *= 2;
j++;
}
for (j = 0; j < sum; j++)
{
count += LCS(a, i);
p = 0;
a[p] += 1;
while (p < i)
{
int temp1, temp2;
temp1 = a[p] % 2; //个位
temp2 = a[p] / 2; //进位
a[p] = temp1;
a[p + 1] += temp2;
p++;
}
}
printf("Scenario #%d:/n%d/n", num, count);
printf("/n");
}
return 0;
}
结果:Time Limit Exceeded
四、正确解法:
再一次认真看题目后,才发现是水货dp.其实就是斐波那契数。

#include "stdio.h"

int fibarr[45] = {0};

//用动态规划来求fibaar
int Memoized(int n)
{
int t;

if (fibarr
!= 0)
{
return fibarr
;
}
if (n == 1)
{
t = 2;
}
if (n == 2)
{
t = 3;
}
if (n > 2)
{
t = Memoized(n - 1) + Memoized(n - 2);
}
return fibarr
= t;
}

int main()
{
freopen("1.txt", "r", stdin);
int i;
int n, t, num, result;

scanf("%d", &n);
num = 1;
for (i = 0; i < n; i++)
{
scanf("%d", &t);
result = Memoized(t);
printf("Scenario #%d:/n%d/n/n", num, result);
num++;
}

return 0;
}
结果:
Accepted196K0MS
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: