【原创】POJ 1703 && RQNOJ 能量项链解题报告
唉
不想说什么了
poj 1703,从看完题到写完第一个版本的代码,只有15分钟
然后一直从晚上八点WA到第二天早上
最后终于发现了BUG,题目要求的“Not sure yet.”,我打成了“No sure yet.”
然后是RQNOJ的NOIP真题,经典的能量项链
从看完题到写完伪码用了30分钟,敲完全部代码用了10分钟
WA 了7次,次次只能过前三个点,后面全部超时。
不能够啊?我动态规划了都,怎么可能超时?
开始优化主函数。
发现通过一个比较,能把N * (N-1)的复杂度降到C(N,2)。
改了后提交,很好,多过了一个点,继续超时
XXXX,我最后发现,居然在递归函数中漏写了if(dp[start][end] != 0)return dp[start][end];!!
当时心中真的是一万匹草泥马碾压而过,还我青春啊!
然后全部10ms内AC了10个点
最后上这两个冤家的代码
加起来送了我10+个WA了吧?
好险我是学法的
POJ 1703:
#include <stdio.h>
typedef struct man
{
int rev;
int parent;
}man;
man set[100008];
int set_find(int p)
{
if(p < 0)return -1;
if(set[p].parent < 0)return p;
return set[p].parent = set_find(set[p].parent);
}
void join(int p,int q)
{
p = set_find(p);
q = set_find(q);
if(p != q)set[p].parent = q;
}
void deal(int p,int q)
{
int tmp_rev1;
int tmp_rev2;
if(set[q].rev == -1)set[q].rev = p;
if(set[p].rev == -1)set[p].rev = q;
tmp_rev1 = set_find(set[p].rev);
tmp_rev2 = set_find(set[q].rev);
p = set_find(p);
q = set_find(q);
if(q != tmp_rev1)join(q,tmp_rev1);
if(p != tmp_rev2)join(p,tmp_rev2);
}
void searchSet(int p,int q)
{
p = set_find(p);
q = set_find(q);
if(p == q)
{
printf("In the same gang.\n");
}
else if(p == set_find(set[q].rev) || q == set_find(set[p].rev))
{
printf("In different gangs.\n");
}
else printf("Not sure yet.\n");
}
int main(void)
{
int T;
int N,M,i;
int CASE;
int num1,num2;
char command;
scanf("%d",&T);
while(T --)
{
scanf("%d%d",&N,&M);
if(N == 2)CASE = 1;
else CASE = 0;
for(i = 0;i <= N;i++)
{
set[i].parent = -1;
set[i].rev = -1;
}
for(i = 0;i < M;i++)
{
getchar();
command = getchar();
scanf("%d%d",&num1,&num2);
if(!CASE)
{
if(command == 'A')
{
searchSet(num1,num2);
}
else if(command == 'D')
{
deal(num1,num2);
}
}
else printf("In different gangs.\n");
}
}
return 0;
}
RQNOJ 能量项链:
#include <stdio.h>
int dp[200][200];
int value[200];
int N;
int pre(int a)
{
if(a == 0)return N - 1;
else return a - 1;
}
int next(int a)
{
if(a == N - 1)return 0;
else return a + 1;
}
int fun(int start,int end)
{
int tmp1,tmp2,i,j,max = 0,result;
if(dp[start][end] != 0)return dp[start][end];
if(start == end)return 0;
for(i = start;i != end;i = next(i))
{
tmp1 = fun(start,i);
tmp2 = fun(next(i),end);
result = tmp1 + tmp2 + value[start] * value[next(i)] * value[next(end)];
if(max < result)max = result;
}
return dp[start][end] = max;
}
int main(void)
{
int i,j,result;
int max,tmp1,tmp2;
scanf("%d",&N);
for(i = 0;i < N;i++)
scanf("%d",&value[i]);
max = 0;
int count = 0;
int size;
for(i = 0;i < N;i++)
{
size = N - i - 1;
count = 0;
for(j = i;count < size;j = next(j),count++)
{
tmp1 = fun(i,j);
tmp2 = fun(next(j),pre(i));
if(value[next(j)] < value[i])
result = tmp1 + tmp2 + value[i] * value[next(j)] * value[i];
else result = tmp1 + tmp2 + value[next(j)] * value[next(j)] * value[i];
if(max < result)max = result;
}
}
printf("%d\n",max);
return 0;
}
posted on 2014-10-15 15:56 shadowmydx'sLab 阅读(193) 评论(0) 编辑 收藏 举报