首页 >> 大全

Find the Spruce

2023-12-20 大全 23 作者:考证青年

题目大意:

_Find the Spruce_Find the Spruce

思路:

求出所有符合要求的图形。一开始想着枚举所有的点(i,j),以点(i,j)为起点,向下不断寻找符合条件的图形,但是觉得太麻烦了。然后发现每一个点是否可以继续向下寻找符合条件的图形完全取决于点(i+1,j-1)、(i+1,j)、(i+1,j+1)这三个点是否都是 * ,并且点(i,j)可以向下找到几个符合条件的图形,也是取决于这三个点中最小的符合条件的图形的数量。这样完全可以从最后一行向上进行动态转移。一开始初始化所有为*的点(i,j),令它们dp[i][j]=1,然后从最后一行向上更新 dp[i][j]+=min(dp[i+1][j-1],min(dp[i+1][j],dp[i+1][j+1])); 最后答案就是所有dp[i][j]之和。

代码:

#include
using namespace std;
const int maxn=500+50;
typedef long long ll;
ll T,n,m,dp[maxn][maxn];char s[maxn][maxn];
int main(){cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++)cin>>s[i]+1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i][j]=='*'){dp[i][j]=1;}else{dp[i][j]=0;}}}ll tot=0;for(int i=n-1;i>=1;i--){for(int j=1;j<=m;j++){if(j-1>=1&&j+1<=m&&dp[i][j]==1&&dp[i+1][j-1]&&dp[i+1][j]&&dp[i+1][j+1]){dp[i][j]+=min(dp[i+1][j-1],min(dp[i+1][j],dp[i+1][j+1]));}}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){tot+=dp[i][j];}}cout<<tot<<endl;}return 0;
} 

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了