題目描述:
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數(一共n個),你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k最大或者最小。 例如,對於下面這圈數字(n=4,m=2):
當要求最小值時,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值時,為((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特別值得注意的是,無論是負數還是正數,對10取模的結果均為非負值。 丁丁請你編寫程式幫他贏得這個遊戲。
輸入輸入檔案第一行有兩個整數,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有個整數,其絕對值不大於10000,按順序給出圈中的數字,首尾相接。
輸出輸出檔案有兩行,各包含乙個非負整數。第一行是你程式得到的最小值,第二行是最大值。
樣例輸入
4 243-1
2樣例輸出781
*emmmm…這應該是一道區間dp,雖然用dfs也能做 *。將n開兩倍,然後把環做成一條鏈,就是一道典型的區間dp了。這道題只需定義乙個三維陣列做區間dp,更新求最大值與最小值即可。具體狀態轉移方程如下
max[i][j][len]=max(ma[i][j][len],ma[i][k-1][len-1]*h);
min[i][j][len]=min(mi[i][j][len],mi[i][k-1][len-1]*h);
max代表最大值,min代表最小值;
i是當前區間的頭,j是尾;k是區間中的某個位置;
h是根據題目得到的m個部分中的乙個部分的總和;
len是指當前的第len個部分;
具體**如下
#include#include#include#include#include#include#include#include#include#include#define ull int
#define re register
using namespace std;
ull n;
ull m;
ull a[101];
ull dis1[101][101][10];
ull dis2[101][101][10];
ull qian[101];//開陣列求字首和,也可直接用a求字首和;
inline ull max(ull x,ull y)//自行定義min函式
inline void init()
for(re ull i=1;i<=2*n;i++)
qian[i]=qian[i-1]+a[i];//字首和
for(re ull i=1;i<=n*2;i++)
for(re ull j=i;j<=2*n;j++)
dis1[i][j][1]=dis2[i][j][1]=((qian[j]-qian[i-1])%10+10)%10;//第一部分直接處理;
for(re ull i=2;i<=m;i++)
for(re ull j=1;j<=n*2;j++)
for(re ull k=j+i-1;k<=2*n;k++)
dis2[j][k][i]=2147483647;//初始化最小值
for(re ull s=2;s<=m;s++)
for(re ull i=1;i<=n*2;i++)
for(re ull j=i+s-1;j<=2*n;j++)
for(re ull k=i+s-2;k<=j-1;k++)
ull ans1=0;
ull ans2=2147483647;
for(re ull i=1;i<=n;i++)
cout這道題確實用dfs做,有興趣的朋友可以去落谷看dfs題解,我這裡就不打了;
noip2003普及組 棧
棧 組合計數,卡特蘭數 o n 2 o n 2 o n2 首先任何一種合法的入棧 出棧操作序列都可以得到乙個不同的1 n的排列,因此可以得到的排列總數等於合法入棧 出棧操作序列的個數。該問題等價於求第n nn項cat alan catalan catala n數。在本題中我們使用公式 cnm cn ...
NOIP2003 普及組 桌球
這是一道模擬題。模擬題 使程式按照題目所敘述的方式進行,模擬整個過程。模擬演算法其實就是給你一堆資料,設計程式將整個模擬過程走一遍,然後得出結果。題目怎麼表述的,程式就怎麼執行。所以模擬題對於演算法設計的要求不高,但是需要選擇合適的資料結構來進行模擬。參考 模擬題考驗的是我們的 實現能力,簡單的模擬...
數字遊戲 NOIp普及組 2003 普及 提高
數字遊戲 題目描述 丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共nn個 你要按順序將其分為mm個部分,各部分內的數字相加,相加所得的mm個結果對1010取模後再相乘,最終得到乙個...