#include<bits/stdc++.h>
#define fi(i, a, b) for(int i = a; i < b ; ++i)
#define fd(i, a, b) for(int i = a; i > b ; --i)
#define all(c) c.begin(), c.end()
#define llu long long
using namespace :: std ;
vector< int > cost, r, s, dp; /**cost stores the cost of various lengths of the rod cost[0] = 0**/
/** s stores the index(or cut) for each smaller rod (smaller sub prob) such that revenue of that sub rod is maximized**/
int n; /**the length of the rod **/
int f( int i)
{
if ( i <= 0 || i > n) /**rod of length less than zero generates zero revenue**/
return 0 ;
if ( dp[ i] == - 1 ) /**if result for this sub rod has'nt been calculated yet**/
{
for ( int j = 1 ; j <= i ; ++ j) /**loop thru all possible sub rods to find the one which generates max revenue**/
if ( dp[ i] < cost[ j] + f( i- j) ) /** cost[j]+f(i-j) means cost of a sub rod + max revenue of the rest of the len**/
{ /**the recursion style is the basis 4 top down DP**/
dp[ i] = cost [ j] + dp[ i- j] ;
s[ i] = j; /**update the sub rod each time we find a cut with better revenue**/
} /**thus at the end of the loop dp[i] stores the max revenue for a rod of length i (it has analysed all possible sub rods)**/
}
return dp[ i] ; /**dp[i] is returned to f(i), hence f(x) returns returns max rev for rod of length x **/
}
int main( )
{
int T,i = 0 ;
// freopen("in.txt", "r", stdin);
// freopen("out2.txt", "w", stdout);
cout << "\n enter the no of test cases" ;
cin >> T;
while ( T-- )
{
cout << "\n enter the length of the rod " << endl;
cin >> n;
dp = vector< int > ( n+ 1 , - 1 ) ;
cost = vector< int > ( n+ 1 , 0 ) ;
s = vector< int > ( n+ 1 , 0 ) ;
i = 0 ;
while ( i<= n)
{
cin >> cost[ i] ;
cout << "\n enter the cost of size " << i++ << "\t :" << endl;
cout << cost[ i- 1 ] ;
}
dp[ 0 ] = 0 ;
dp[ 1 ] = cost[ 1 ] ;
cout << "\n max revenue is :\t " << f( n) << endl;
cout << "\n array s is :\n " ;
for ( auto it : s)
cout << it<< ' ' ;
cout << "\n array dp is :" << endl;
for ( auto it : dp)
cout << it<< ' ' ;
cout << endl;
}
return 0 ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBmaShpLCBhLCBiKSBmb3IoaW50IGkgPSBhOyBpIDwgYiA7ICsraSkKI2RlZmluZSBmZChpLCBhLCBiKSBmb3IoaW50IGkgPSBhOyBpID4gYiA7IC0taSkKI2RlZmluZSBhbGwoYykgYy5iZWdpbigpLCBjLmVuZCgpCiNkZWZpbmUgbGx1IGxvbmcgbG9uZwoKdXNpbmcgbmFtZXNwYWNlOjpzdGQ7CnZlY3RvcjxpbnQ+IGNvc3QsIHIsIHMsIGRwOy8qKmNvc3Qgc3RvcmVzIHRoZSBjb3N0IG9mIHZhcmlvdXMgbGVuZ3RocyBvZiB0aGUgcm9kIGNvc3RbMF0gPSAwKiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIHMgc3RvcmVzIHRoZSBpbmRleChvciBjdXQpIGZvciBlYWNoIHNtYWxsZXIgcm9kIChzbWFsbGVyIHN1YiBwcm9iKSBzdWNoIHRoYXQgcmV2ZW51ZSBvZiB0aGF0IHN1YiByb2QgaXMgbWF4aW1pemVkKiovCmludCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKnRoZSBsZW5ndGggb2YgdGhlIHJvZCAqKi8KaW50IGYoaW50IGkpCnsKICAgIGlmKGkgPD0wIHx8IGkgPiBuKSAgICAgICAgICAgICAgLyoqcm9kIG9mIGxlbmd0aCBsZXNzIHRoYW4gemVybyBnZW5lcmF0ZXMgemVybyByZXZlbnVlKiovCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZihkcFtpXSA9PSAtMSkgICAgICAgICAgICAgICAgIC8qKmlmIHJlc3VsdCBmb3IgdGhpcyBzdWIgcm9kIGhhcydudCBiZWVuIGNhbGN1bGF0ZWQgeWV0KiovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IDE7IGogPD0gIGkgOyArK2opICAgICAgICAgICAgICAgLyoqbG9vcCB0aHJ1IGFsbCBwb3NzaWJsZSBzdWIgcm9kcyB0byBmaW5kIHRoZSBvbmUgd2hpY2ggZ2VuZXJhdGVzIG1heCByZXZlbnVlKiovCiAgICAgICAgICAgICAgICBpZihkcFtpXSA8IGNvc3Rbal0rZihpLWopKSAgICAgICAgICAgICAgLyoqIGNvc3Rbal0rZihpLWopIG1lYW5zIGNvc3Qgb2YgYSBzdWIgcm9kICsgbWF4IHJldmVudWUgb2YgdGhlIHJlc3Qgb2YgdGhlIGxlbioqLwogICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqdGhlIHJlY3Vyc2lvbiBzdHlsZSBpcyB0aGUgYmFzaXMgNCB0b3AgZG93biBEUCoqLwogICAgICAgICAgICAgICAgICAgIGRwW2ldID0gY29zdCBbal0gKyBkcFtpLWpdOwogICAgICAgICAgICAgICAgICAgIHNbaV0gPSBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKip1cGRhdGUgdGhlIHN1YiByb2QgZWFjaCB0aW1lIHdlIGZpbmQgYSBjdXQgd2l0aCBiZXR0ZXIgcmV2ZW51ZSoqLwogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqdGh1cyBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIGRwW2ldIHN0b3JlcyB0aGUgbWF4IHJldmVudWUgZm9yIGEgcm9kIG9mIGxlbmd0aCBpIChpdCBoYXMgYW5hbHlzZWQgYWxsIHBvc3NpYmxlIHN1YiByb2RzKSoqLwogICAgICAgICAgICB9CiAgICAgcmV0dXJuIGRwW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqZHBbaV0gaXMgcmV0dXJuZWQgdG8gZihpKSwgaGVuY2UgZih4KSByZXR1cm5zIHJldHVybnMgbWF4IHJldiBmb3Igcm9kIG9mIGxlbmd0aCB4ICoqLwp9CmludCBtYWluKCkKewogICAgaW50IFQsaSA9IDA7CiAgIC8vIGZyZW9wZW4oImluLnR4dCIsICJyIiwgc3RkaW4pOwogICAgIC8vIGZyZW9wZW4oIm91dDIudHh0IiwgInciLCBzdGRvdXQpOwogICAgY291dDw8IlxuZW50ZXIgdGhlIG5vIG9mIHRlc3QgY2FzZXMiOwoKICAgICAgICBjaW4+PlQ7CiAgICAgICAgd2hpbGUoVC0tKQogICAgICAgIHsKICAgICAgICAgICAgY291dDw8IlxuZW50ZXIgdGhlIGxlbmd0aCBvZiB0aGUgcm9kICI8PGVuZGw7CiAgICAgICAgICAgIGNpbj4+bjsKCiAgICAgICAgICAgIGRwID0gdmVjdG9yPGludD4gKG4rMSwgLTEpOwogICAgICAgICAgICBjb3N0ID0gdmVjdG9yPGludD4gKG4rMSwgMCk7CiAgICAgICAgICAgIHMgPSB2ZWN0b3I8aW50PiAobisxLCAwKTsKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHdoaWxlKGk8PW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2luPj5jb3N0W2ldOwogICAgICAgICAgICAgICAgICAgIGNvdXQ8PCJcbmVudGVyIHRoZSBjb3N0IG9mIHNpemUgIjw8aSsrPDwiXHQ6Ijw8ZW5kbDsKICAgICAgICAgICAgICAgICAgICBjb3V0PDxjb3N0W2ktMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkcFswXSA9IDA7CiAgICAgICAgICAgICAgICBkcFsxXSA9IGNvc3RbMV07CiAgICAgICAgICAgIGNvdXQ8PCJcbm1heCByZXZlbnVlIGlzIDpcdCI8PGYobik8PGVuZGw7CiAgICAgICAgICAgIGNvdXQ8PCJcbmFycmF5IHMgaXMgOlxuIjsKICAgICAgICAgICAgZm9yKGF1dG8gaXQgOiBzKQogICAgICAgICAgICAgICAgY291dDw8aXQ8PCcgJzsKICAgICAgICAgICAgY291dDw8IlxuYXJyYXkgZHAgaXMgOiI8PGVuZGw7CiAgICAgICAgICAgIGZvcihhdXRvIGl0IDogZHApCiAgICAgICAgICAgICAgICBjb3V0PDxpdDw8JyAnOwogICAgICAgICAgICBjb3V0PDxlbmRsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKfQo=