p1149火柴棒等式,dp打表

主要是怎么求每个数的火柴数
设一个数字火柴数dp【i】,dp【i】=dp【i/10】+dp【i%10】
dp打表代码(时间最佳)
#include <bits/stdc++.h>

using namespace std;
int n,ans;
int num[2005]={6,2,5,5,4,5,6,3,7,6};

int main(int argc, char** argv) {
	cin>>n;
	n-=4;
	for(int i=10;i<=2000;i++){
		num[i]=num[i/10]+num[i%10];
	}
	
	for(int i=0;i<=1000;i++){
		for(int j=0;j<=1000;j++){
			if(num[i]+num[j]+num[i+j]==n) ans++;
		}
	}
	
	cout<<ans<<endl;
	
	return 0;
}

也可用while取每个位数来求(和上基本持平,大数据时较差)
#include <bits/stdc++.h>

using namespace std;
int n,ans;
int alph[10]={6,2,5,5,4,5,6,3,7,6};
int num[2005]={6};//0在初始化时不好处理 

int main(int argc, char** argv) {
	cin>>n;
	n-=4;
	for(int i=1;i<=2000;i++){
		int j=i;
		while(j){
			num[i]+=alph[j%10];
			j/=10;
		}
	}
	
	for(int i=0;i<=1000;i++){
		for(int j=0;j<=1000;j++){
			if(num[i]+num[j]+num[i+j]==n) ans++;
		}
	}
	
	cout<<ans<<endl;
	
	return 0;
}

临时递归(最差的效率,耗时是上10倍以上)
#include <bits/stdc++.h>

using namespace std;
int n,ans;
int num[2005]={6,2,5,5,4,5,6,3,7,6};

int count(int x){
	int ans=0;
	if(x==0) return 6;
	while(x){
		ans+=num[x%10];
		x/=10;
	}
	return ans;
}
int main(int argc, char** argv) {
	cin>>n;
	n-=4;
	
	for(int i=0;i<=1000;i++){
		for(int j=0;j<=1000;j++){
			if(count(i)+count(j)+count(i+j)==n) ans++;
		}
	}
	
	cout<<ans<<endl;
	
	return 0;
}


全部评论

相关推荐

09-29 11:19
门头沟学院 Java
点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务