-
2008-06-07
百度之星DayI我AC的两个程序 - [As a ACMer]
嗯...貌似zzn说的方法第4题可以AC了都……我的还错了5个点 由此就不说了
第三题那个程已经贴出来了 呵呵 感兴趣的去翻翻看咯 貌似可以AC
感到惊奇的是 竟然有好多人想看1、2题的程序……
贴上来咯 给大家评论一番
/*
* =====================================================================================
*
* Filename: astar1.cpp
*
* Description: 广告区间排名
*
* Version: 1.0
* Created: 2008/5/31 19:34:54
* Revision: none
* Compiler: gcc
*
* Author: Coldwings Alpc42 (D.R.), dodele@gmail.com
* Company: NUDT
*
* =====================================================================================
*/#include<cstdio>
#include<cstring>
#include<cstdlib>int a[100001],n,ts;
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&ts);
a[n]=0;
int i=0,j=-1,s=0,ans=-1;
while(j<n) {
s+=a[++j];
while(s<ts && j<n) s+=a[++j];
while(s-a[i]>=ts && i<j) s-=a[i++];
if (s>=ts && (j-i<ans || ans==-1))
ans=j-i;
}
printf("%d\n",ans);
return 0;
}/*
* =====================================================================================
*
* Filename: astar2.cpp
*
* Description: LZW网页判重
*
* Version: 1.0
* Created: 2008/5/31 19:50:48
* Revision: none
* Compiler: gcc
*
* Author: Coldwings Alpc42 (D.R.), dodele@gmail.com
* Company: NUDT
*
* =====================================================================================
*/#include<string>
using namespace std;
bool inset(char x) {
return ('0'<=x && x<='9' || 'a'<=x && x<='z' || 'A'<=x && x<='Z');
}int trans(char* st,string* a) {
if (*st) {
if (*st<0) {
*a=(*(st++));
*a+=(*(st++));
return trans(st,a+1)+1;
} else {
*a=*(st++);
if (inset((*a)[0])) {
while(inset(*st)) {
*a+=*(st++);
}
}
return trans(st,a+1)+1;
}
} else {
return 0;
}
}string a[256],b[256];
int la,lb;void init() {
char ta[256],tb[256];
scanf("%s",ta);
scanf("%s",tb);
la=trans(ta,a+1);
lb=trans(tb,b+1);
a[0]="";
b[0]="";
}inline int min(int a,int b) { return a<b?a:b; }
inline int max(int a,int b) { return a>b?a:b; }
int d[256][256],f[256][256];
int main() {
init();
memset(d,0,sizeof(d));
for(int k=1;k<=min(la,lb);k++)
for(int i=k;i<=la;i++)
for(int j=k;j<=lb;j++)
if (a[i]==b[j])
d[i][j]=d[i-1][j-1]+1;
else
d[i][j]=0;
memset(f,0,sizeof(f));
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;j++) {
f[i][j]=max(f[i-1][j],f[i][j-1]);
for(int k=1;k<=d[i][j];k++)
if (f[i][j]<f[i-k][j-k]+k*k)
f[i][j]=f[i-k][j-k]+k*k;
}
printf("%d\n",f[la][lb]);
return 0;
}随机文章:
百度之星 进复赛了 2008-06-09百度之星复赛... 2008-06-14Baidu A*Star again... 2008-06-07乱啊乱 2008-06-04Coldwings in Hangzhou... 2008-05-11
收藏到:Del.icio.us








评论
for(int i=k;i<=la;i++)
for(int j=k;j<=lb;j++)
if (a[i]==b[j])
d[i][j]=d[i-1][j-1]+1;
else
d[i][j]=0;
中第一行的循环 for(int k=1;k<=min(la,lb);k++) 没必要的吧?
d[i][j] = d[i-1][j-1] + 1;中 始终都是d[i-1][j-1]先计算过了..k增加过程..貌似d[i][j]并没有改变?
[我DP很差.. 没看懂这里.....]