1.pku 1088滑雪
这道题我在笔试的时候用贪心法,得了0分;后来想到了用泛洪的方法,算法效率差;正确答案是用深搜+动态规划。
#include<stdio.h>
#include<memory.h>
int R,C;
int a[101][101];//各点高度
int f[101][101];//各点最大滑雪长度
inline int max(int a,int b){
return a>b?a:b;
}
inline int Max(int a,int b,int c,int d){
return max(max(a,b),max(c,d));
}
int dfs(int row,int col,int h){
if(row<1||row>R||col<1||col>R||h<=a[row][col])
return 0;
if(f[row][col]>=0)
return f[row][col];
f[row][col]=Max(dfs(row-1,col,a[row][col]),dfs(row+1,col,a[row][col]),dfs(row,col-1,a[row][col]),dfs(row,col+1,a[row][col]))+1;
return f[row][col];
}
int main(){
int t,i,j;
scanf("%d",&t);
while(t--){
int max=0;
memset(f,-1,sizeof(f));
scanf("%d%d",&R,&C);
for(i=1;i<=R;++i)
for(j=1;j<=C;++j)
scanf("%d",&a[i][j]);
for(i=1;i<=R;++i)
for(j=1;j<=C;++j)
{
int num=dfs(i,j,0xffffff);
printf("%d\n",num);
if(max<num)
max=num;
}
printf("%d\n",max);
}
return 0;
}
2.剑指offer上的找牌中的顺子,用了排序和hash两种方法。
排序法:
#include<stdio.h>
#include<sys/types.h>
#include<iostream>
using namespace std;
#include<algorithm>
int compare(const void * arg1,const void * arg2)
{
return *(int *)arg1 - *(int *)arg2;
}
bool iscontinuous(int * num,int len){
if(num==NULL||len<1)
return false;
qsort(num,len,sizeof(int),compare);
int numofzero=0,numofgap=0;
for(int i=0;i<len&&num[i]==0;++i)
++numofzero;
int small=numofzero;
int big=small+1;
while(big!=len)
{
if(num[small]==num[big]) return false;
numofgap+=num[big]-num[small]-1;
small=big;
big++;
}
return numofgap>numofzero?false:true;
}
int main(){
int num1[]={5,8,7,9,0};
int num2[]={2,4,6,7,0};
bool b1=iscontinuous(num1,5);
bool b2=iscontinuous(num2,5);
printf("%d %d",b1,b2);
return 0;
}
hash法:
#include<stdio.h>
bool iscon(int * num,int len)
{
int hashtable[14]={};
for(int i=0;i<len;++i)
hashtable[num[i]]++;
int numofzero=hashtable[0];
int numofgap=0;
int index=1;
while(hashtable[index]==0) index++;
int numoftemp=0;
for(int i=index;i<14;++i)
{
int hi=hashtable[i];
if(hi>1) return false;
else if(hi==0) numoftemp++;
else {
numofgap+=numoftemp;
numoftemp=0;
}
}
//printf("%d %d\n",numofgap,numofzero);
return numofgap>numofzero?false:true;
}
int main(){
int num1[]={5,8,7,9,0};
int num2[]={2,4,6,7,0};
bool b1=iscon(num1,5);
bool b2=iscon(num2,5);
printf("%d %d",b1,b2);
return 0;
}