P8725 dp方程是哪里有问题,先不考虑数据量
  • 板块学术版
  • 楼主Tachikawa_Ruri
  • 当前回复17
  • 已保存回复17
  • 发布时间2024/3/16 10:03
  • 上次更新2024/3/16 11:59:36
查看原帖
P8725 dp方程是哪里有问题,先不考虑数据量
787602
Tachikawa_Ruri楼主2024/3/16 10:03
#include<bits/stdc++.h>
using namespace std;
int d,t,m;
const int M=4000;
int dp[80][80][80];
int main() {
	cin>>d>>t>>m;
	dp[0][0][d]=1;
	for(int i=1; i<=t; i++) {
		for(int j=0; j<=m; j++) {
			for(int k=d; k<=d+m; k++) {
				if(j>=1&&k-1>=0)
					dp[i][j][k]+=dp[i-1][j-1][k-1];
				dp[i][j][k]+=dp[i-1][j][k+1];
			}
			for(int k=d; k>0; k--) {
				if(j>=1&&k-1>=0)
					dp[i][j][k]+=dp[i-1][j-1][k-1];
				dp[i][j][k]+=dp[i-1][j][k+1];
			}
		}
	}
	int ans=0;
	//for(int i=1;i<=t;i++)
	//for(int j=1;j<=m;j++)
	//for(int k=1;k<=d+m;k++)
	//cout<<dp[i][j][k]<<" "; 
	for(int k=d+m; k>0; k--) ans+=dp[t][m][k];
	cout<<endl<<ans;
}

dp[i][j][k] i表示过去了多少秒,j表示消耗了多少体力,k表示距离峡谷的距离,我是这样想的,每一秒的状态无非就是上一秒消耗体力或是不消耗体力,消耗体力的话距离+1,不消耗体力距离就-1,因为i==0&&j==0时距离峡谷为d,之后要么往上游,要么往下游,分开进行状态转移,所以有两个循环,最后再把i==t,j==m同时k>0的数量加在一起就是总的方法数,我感觉我想的应该没什么问题,但结果不对,求大佬看看我的思路是哪里出错了

2024/3/16 10:03
加载中...