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


全部评论

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务