ファーウェイ動的計画問題


  • 第1題
  • 正の整数Xを入力し、次の式の左側の数字の間に+番号または-番号を追加して式を成立させます.1 2 3 3 4 5 6 7 8 9=Xたとえば、12-34+5-67+89=5 1+23+4-5+6-7-8-9=5入力整数を満たすすべての整数個数を統計するプログラムを作成してください.入力:正の整数、式の右側のデジタル出力:この式を成立させる個数サンプル入力:5サンプル出力:21
    作者:阿超は私の出所です:CSDN原文:https://blog.csdn.net/huangpin815/article/details/77132297本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!
    #include
    #include
    using namespace std;
    //    :         q  :  ,  , (    )
    int dp(int before,int des,int res,int ex)
    {
    	if(before==0)
    	{//         ==0
    		if(des==res)
    		{
    			return 1;
    		}
    		else
    			return 0;
    	}
    	return dp(before-1,before,res-des,1)+dp(before-1,before,res+des,1)+dp(before-1,before*pow(10,ex)+des,res,ex+1);
    }
    	
    int main()
    {
    	int n;
    	cin>>n;
    	int count=dp(8,9,n,1);
    	cout<
  • 第二題/*平安果
  • 簡単な説明:1つのM行N列の行列を与える(M*N個の格子)各格子には一定数の平安果が置かれています.左上のそれぞれから、下または右に行くしかありません.目的地は右下の格子です.1つの格子を通るたびに、格子の平安果を集めます.どれだけ多くの平安果を集めることができますか.注意:1つの格子を通るときは、一度に格子の中の平をアンゴは全部持って行った.制限条件:1
    入力説明:入力は2つの部分を含む:第1行M,Nは次にM行,N個の平安果数を含む
    出力説明:整数で最も多く取られた平安果の数
    例:
    入力2 4 1 2 3 40 6 7 8 90
    出力136//考え方:ダイナミックプランニングダイナミック方程式:現在位置で得られる最大リンゴ数=max(上から最大リンゴ+左から最大リンゴを得ることができる)dp(0,0)=app[0][0]*/
    #include
    using namespace std;
    int Map[50][50];
    int maxnum=0;
    void dp(int r,int c,int cost)
    {
    	if(r==0&&c==0)
    	{
    		maxnum=cost+Map[0][0];
    		return;
    	}
        if(r-1>=0&&c-1>=0)
    	{
    		if(Map[r][c-1]>Map[r-1][c])
    			dp(r,c-1,cost+Map[r][c]);
    		else
    			dp(r-1,c,cost+Map[r][c]);
    	}
    	if(r==0&&c>0)
    	{
    		dp(r,c-1,cost+Map[r][c]);
    	}
    	if(c==0&&r>0)
    	{
          	dp(r-1,c,cost+Map[r][c]);
    	}
    }
    
    
    
            
    int main()
    {
    	int m,n;
    	cin>>m>>n;
    	for(int i=0;i>Map[i][j];
    		}
    	}
    	dp(m-1,n-1,0);
    	cout<