两道网易ttt编程题

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值