题意:

由0-9的数字组成一个形如沙漏的图形,要求从第一行开始沿左下或者右下到达最后一行,问有多少种不同的路径,使最后路径上的整数之和为给定的某个数。

分析:

简单计数dp,从最后一行开始,设dp[i][j][k]为从下往上已经走过i行,走到第j列,此时路径上的整数之和为k的路径种数。得到递归方程:

dp[i][j][k] += dp[i-1][j][k-a[i][j]] +dp[i-1][j + 1][k-a[i][j]];

最后dfs输出路径,注意多条路径时要求坐标字典序最小!

代码:

#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
const int maxn =100, INF =0x3fffffff;
int a[maxn][maxn];
long long dp[maxn][maxn][550];
int n, p;
void dfs(int i, int j, int t)
{
if(i == 2*n-1) return;
int temp;
if(i < n){
if(j>1&&dp[2*n-i-1][j-1][t-a[i][j]]){
cout<<'L';
temp = j-1;
}else{
cout<<'R';
temp = j;
}
dfs(i+1,temp,t-a[i][j]);
}else {
if(dp[2*n-i-1][j][t-a[i][j]]){
cout<<'L';
temp = j;
}else{
cout<<'R';
temp = j + 1;
}
dfs(i+1,temp,t-a[i][j]);
} return;
}
int main (void)
{
while(cin>>n>>p && n||p){
for(int i = 1; i <= n; i++)
for (int j = 1; j <=n-i+1; j++)
cin>>a[i][j]; for(int i = n + 1; i < 2 * n; i++)
for (int j = 1; j <= i - n + 1; j++)
cin>>a[i][j]; memset(dp,0,sizeof(dp)); for(int i = 2 * n - 1; i >= n; i--)
for(int j = 1; j <= i - n+1; j++)
for(int k = a[i][j]; k <= p; k++){
if(i==2*n-1 && k==a[i][j]) dp[1][j][k]=1;
else dp[2*n- i][j][k] += dp[2*n-i-1][j][k-a[i][j]] +dp[2*n-i-1][j + 1][k-a[i][j]];
} for(int i = n-1; i > 0; i--){
for(int j = 1; j <= n - i + 1; j++){
for(int k = a[i][j]; k <= p; k++){
if(j > 1) dp[2*n - i][j][k] += dp[2*n-i-1][j - 1][k-a[i][j]];
if(j < n-i+1) dp[2*n- i][j][k] += dp[2*n-i-1][j][k-a[i][j]];
}
}
}
long long total = 0;
int s;
for(int i = n; i >= 1; i--){
if(dp[2*n-1][i][p]>0){
total += dp[2*n-1][i][p];
s = i;
}
}
if(total == 0) cout<<0<<endl<<endl;
else{
cout<<total<<endl;
cout<<s-1<<' ';
dfs(1,s,p);
cout<<endl;
}
}
return 0;
}
  • 仔细审题!!!读题上太浮躁,不止一次坑在题意上了。
  • 调试时间较久,思路捋顺,写代码的时候尽量避免一些细节错误。

最新文章

  1. EntityFramework linq 多条件查询,不定条件查询
  2. Zend Studio 11.0 汉化
  3. SQL Server被锁的表以及解锁
  4. Ⅰ.net通信指前提
  5. JDBC工作模块
  6. source insight用于C语言编程的工具脚本
  7. 踩到两只“bug”
  8. Python3 如何优雅地使用正则表达式(详解七)
  9. CSS3 transition 动画过度属性
  10. 使用高通SDK开发AR应用
  11. CentOS 7 安装Subversion, 并用Nginx代理
  12. IdentityServer4 退出登录后,跳转到原来页面
  13. C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)
  14. Redis基础及入门
  15. android sqlite android.database.CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5
  16. requests模块
  17. requests应用
  18. mysql explain(转)
  19. 身高安排方法(基础dfs)
  20. Spring IOC 容器源码分析 - 创建原始 bean 对象

热门文章

  1. SpringBoot 2.x (2):请求和传参
  2. iOS 中集成百度echarts3.0
  3. 掌握Spark机器学习库-07.14-保序回归算法实现房价预测
  4. JData 整合ArtTemplate的前端框架
  5. GIS在石油行业中的应用
  6. postgresql update from
  7. sql发送邮件- html 格式
  8. Vuex/Vue 练手项目 在线汇率转换器
  9. python 需求分析
  10. 关于 &lt;script type=&#39;text/template&#39; &gt; 的妙用 / 使用jquery获取iframe加载完成事件