問題描述:
分析
依然使用動規來做,找下狀態轉移方程。
dp[num][k][b]表示將數num劃分為k個數,且每個數不小於b。
第一問,
dp[num][k][b]=dp[num-b][k-1][b]+dp[num][k][b+1];
第二問,
dp[num][k][b]=dp[num-b][k-1][b+1]+dp[num][k]
[b+1];
第三問,
dp[num][k][b]=dp[num-b][k-1][b]+dp[num][k][b+1];
(b為奇)
dp[num][k][b]=dp[num][k][b+1];
(b為偶)
邊界條件:k為1時的情況即為邊界。
這道題做的一直在超時的邊緣,呃,,,。應該繼續優化。
原始碼
#include
#include
#include
using
namespace
std;
int dp[51][51][51];
int fun1(int inum,int ik) }}
}*//* memset(dp, 0, sizeof(dp));
for (int num=1; num<=inum; num++) }*/
for(int num=2; num<=inum; num++) }}
return dp[inum][ik][1];
}int fun2(int inum) }}
}*//* memset(dp, 0, sizeof(dp));
for (int num=1; num<=inum; num++) }*/
for(int num=2; num<=inum; num++) }}
int sum=0;
for (int k=1; k<=inum; k++)
return sum;
}int fun3(int inum) }}
}*/for (int num=1; num<=inum; num += 2)
}
for(int num=2; num<=inum; num++)
else }}
}int sum=0;
for (int k=1; k<=inum; k++)
return sum;
}int main()
}cout
<< fun1(num, k) << endl;
cout
<< fun2(num) << endl;
cout
<< fun3(num) << endl;
}return
0;}
———————————2016/6/23—————-
晚上回來又試了一下。因為是多case問題,可以先把所有的結果都計算出來,然後每輸入一種情況直接輸出相應結果。修改**如下:
#include
#include
#include
using
namespace
std;
int dpo[51][51][51];
int dps[51][51][51];
int sums[51];
int dpt[51][51][51];
int sumt[51];
void fun1()
}for(int num=2; num<=50; num++) }}
}void fun2()
}for(int num=2; num<=50; num++) }}
memset(sums, 0, sizeof(sums));
for (int num=1; num<=50; num++)
}}void fun3()
}
for(int num=2; num<=50; num++)
else }}
}memset(sumt, 0, sizeof(sumt));
for (int num=1; num<=50; num++)
}}int main()
return
0;}
演算法期末考試複習題
xd的小夥伴們很適合哦 program 1 1 歸併排序在最差最好平均情況下的時間複雜度分別是多少?答案 nlgn nlgn 2 判斷 歸併排序的空間複雜度是o 1 判斷 答案 false 應該是 o n 3 優先佇列提取最大元素的演算法時間複雜度?用o表示 答案 o lgn 4 堆排序在最差最好平...
關於彙編的期末考試複習1
彙編期末考試備考 1.組合語言屬於機器語言。2.處理器是由運算器,控制器和暫存器組構成的 3.儲存器的乙個位元組表示8位 bit 例如 暫存器ax分為高八位ah和低八位al兩個位元組,4.mov操作指令的使用方式 1.mov 暫存器,資料 例如 mov ax,8 2.mov 暫存器,暫存器 例如 m...
複雜的整數劃分問題
description 將正整數 n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數 n 的這種表示稱為正整數 n 的劃分。input 標準的輸入包含若干組測試資料。每組測試資料是一行輸入資料,包括兩個整數n 和 k。0 n 50,0 k n output 對...