1個長度為2n的數,如果左邊n個數的和 = 右邊n個數的和,那麼就是乙個幸運號碼。例如:99、1230、123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod 10^9 + 7的結果即可。
題目解法:簡單dp
設出陣列dp【】【】,dp【i】【j】表示第i個數的和為j的個數
首先是最原始**:
#include #include #include #include #include #include typedef long long ll;
using namespace std;
const int maxn = 1005;
int table[maxn][maxn*9+100];//不帶0的dp
int dp[maxn][maxn*9+100];//帶0的dp
int n;
const int mod = 1e9 + 7;
int main()
dp[1][0] = 1;
for(int i=1;i<=1001;i++)}}
while(~scanf("%d",&n))
printf("%lld\n",sum);
}return 0;
}
這份**問題很大,其中記錄的陣列有兩個,顯然不能設定成long long,否則會超出空間限制,那麼就在計算的時候很小心,千萬不能計算越界。這裡說明個事情,這裡是單組資料測試,如果是多組資料測試,我這份**還是有優勢的。
單組測試的有效陣列就只有兩個,乙個帶零的乙個不帶的,就宣告兩個就夠了,進行其次不帶零的數可以推出,例如dp【i】【j】不帶零的結果就是dp【i】【j】帶零的-dp【i-1】【j】帶零的。
當然,下面的**就是借鑑的大佬的了,寫的非常不錯。
typedef long long ll;
using namespace std;
const int maxn = 1005;
int table[maxn][maxn*9+100];
int dp[maxn][maxn*9+100];
int n;
const int mod = 1e9 + 7;
int main()
dp[1][0] = 1;
for(int i=1;i<=1001;i++)}}
while(~scanf("%d",&n))
printf("%lld\n",sum);
}return 0;
}
51NOD 1043 幸運號碼
基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 1個長度為2n的數,如果左邊n個數的和 右邊n個數的和,那麼就是乙個幸運號碼。例如 99 1230 123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod 10 9 7的結果...
51Nod 幸運數字(打表)
1043 幸運號碼 基準時間限制 1 秒 空間限制 131072 kb 分值 20難度 3級演算法題 1個長度為2n的數,如果左邊n個數的和 右邊n個數的和,那麼就是乙個幸運號碼。例如 99 1230 123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod ...
AC日記 幸運號碼 51nod 1043
幸運號碼 思路 傳說中的數字dp 不難發現,n n 1000 那麼,n個數的最大和為9 1000 9000 對於9000 1000的時間範圍,我們可以用dp來解決 dp i j 表示第i為數總和為j的號碼的個數 每個dp i j 都是dp i 1 j v 0 v 9 的總和 然後按照左邊的n和右邊的...