dynamic programming (continued)

132
Dynamic Dynamic Programming Programming (continued) (continued) Programming Puzzles and Competitions Programming Puzzles and Competitions CIS 4900 / 5920 CIS 4900 / 5920 Spring 2009 Spring 2009

Upload: hilda-rivera

Post on 31-Dec-2015

39 views

Category:

Documents


1 download

DESCRIPTION

Dynamic Programming (continued). Programming Puzzles and Competitions CIS 4900 / 5920 Spring 2009. TCO 09 Algorithms (Feb.). Today. TCO 09 Algorithms (March). Lecture Outline. Order Notation (for real this time) Dynamic Programming w/ Iteration Fibonacci numbers (revisited) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Dynamic Programming (continued)

Dynamic Dynamic Programming Programming (continued)(continued)

Dynamic Dynamic Programming Programming (continued)(continued)

Programming Puzzles and CompetitionsProgramming Puzzles and CompetitionsCIS 4900 / 5920CIS 4900 / 5920

Spring 2009Spring 2009

Page 2: Dynamic Programming (continued)

TCO 09 Algorithms (Feb.) Today

Page 3: Dynamic Programming (continued)

TCO 09 Algorithms (March)

Page 4: Dynamic Programming (continued)

Lecture Outline• Order Notation (for real this time)• Dynamic Programming w/ Iteration• Fibonacci numbers (revisited)• Text Segmentation (revisited)• ACM ICPC

Page 5: Dynamic Programming (continued)

Algorithmic Complexity• We would like to be able to

describe how long a program takes to run

Page 6: Dynamic Programming (continued)

Algorithmic Complexity• We would like to be able to

describe how long a program takes to run

• We should express the runtime in terms of the input size

Page 7: Dynamic Programming (continued)

Algorithmic Complexity• Absolute time measurements are

not helpful, as computers get faster all the time

Page 8: Dynamic Programming (continued)

Algorithmic Complexity• Absolute time measurements are

not helpful, as computers get faster all the time

• Also, runtime is clearly dependent on the input (and input size)

Page 9: Dynamic Programming (continued)

Order Notation• We define O(*) as follows

Page 10: Dynamic Programming (continued)

Order Notation• Basically, we just want to count

the number of operations (without being too precise)

Page 11: Dynamic Programming (continued)

Examples• What’s the complexity of the

following code?

int c = a + b;

Page 12: Dynamic Programming (continued)

Examples• What’s the complexity of the

following code?

int c = a + b;

• Answer: O(1)

Page 13: Dynamic Programming (continued)

Examples• What’s the complexity of the

following code?

int c = a + b;

• Answer: O(1)– (it actually depends on how you count)

Page 14: Dynamic Programming (continued)

Example 2for(int i = 0; i < n; ++i) {

//do something}

Page 15: Dynamic Programming (continued)

Example 2for(int i = 0; i < n; ++i) {

//do something}

• Answer: O(n)

Page 16: Dynamic Programming (continued)

Example 2for(int i = 0; i < n; ++i) {

//do something}

• Answer: O(n)– O(c) operations for each i O(cn)

== O(n) total operations

Page 17: Dynamic Programming (continued)

Example 2for(int i = 0; i < n; ++i) {

for(int j = 0; j < n; ++j) {//do something

}}

Page 18: Dynamic Programming (continued)

Example 2for(int i = 0; i < n; ++i) {

for(int j = 0; j < n; ++j) {//do something

}}

• Answer: O(n2)

Page 19: Dynamic Programming (continued)

Example 2for(int i = 0; i < n; ++i) {

for(int j = 0; j < n; ++j) {//do something

}}

• Answer: O(n2)– O(n) operations for each i == n * n total

operations == O(n2) total operations

Page 20: Dynamic Programming (continued)

Example 3for(int i = 0; i < n; ++i) {

for(int j = i; j < n; ++j) {//do something

}}

Page 21: Dynamic Programming (continued)

Example 3for(int i = 0; i < n; ++i) {

for(int j = i; j < n; ++j) {//do something

}}

• The first iteration of the outer loop takes O(n)

Page 22: Dynamic Programming (continued)

Example 3for(int i = 0; i < n; ++i) {

for(int j = i; j < n; ++j) {//do something

}}

• The second iteration of the outer loop takes O(n-1)

Page 23: Dynamic Programming (continued)

Example 3for(int i = 0; i < n; ++i) {

for(int j = i; j < n; ++j) {//do something

}}

• The third iteration of the outer loop takes O(n-2)…

Page 24: Dynamic Programming (continued)

Example 3for(int i = 0; i < n; ++i) {

for(int j = i; j < n; ++j) {//do something

}}

• The last iteration of the outer loop takes O(1)

Page 25: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = ?

Page 26: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = ?• Call this sum N

Page 27: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

Page 28: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

N = n + (n-1) + … + 2 + 1

Page 29: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

N = n + (n-1) + … + 2 + 1N = 1 + 2 + … + (n-1) + n

Page 30: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

N = n + (n-1) + … + 2 + 1N = 1 + 2 + … + (n-1) + n

• Now, add these two together:2N = (n + 1) + ((n-1) + 2) + … + (1 + n)

Page 31: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

N = n + (n-1) + … + 2 + 1N = 1 + 2 + … + (n-1) + n

• Now, add these two together:2N = (n + 1) + ((n-1) + 2) + … + (1 + n)

= n * (n + 1)

Page 32: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

N = n + (n-1) + … + 2 + 1N = 1 + 2 + … + (n-1) + n

• Now, add these two together:2N = (n + 1) + ((n-1) + 2) + … + (1 + n)

= n * (n + 1)N = n * (n + 1) / 2

Page 33: Dynamic Programming (continued)

Example 3• n + (n–1) + … + 1 = N• Call this sum N

N = n + (n-1) + … + 2 + 1N = 1 + 2 + … + (n-1) + n

• Now, add these two together:2N = (n + 1) + ((n-1) + 2) + … + (1 + n)

= n * (n + 1)N = n * (n + 1) / 2 = O(n2)

Page 34: Dynamic Programming (continued)

Examples• This is also the number of ways 2 items

can be chosen from a set of (n + 1) items, disregarding order and without replacement (also called “(n + 1) choose 2”, binomial coefficient)

2

)1(

)!1(!2

)!1(

)!2)1((!2

)!1(2

1

nn

n

n

n

nn

Page 35: Dynamic Programming (continued)

Fibonacci Numbers• F0 = 0

• F1 = 1

• Fn = Fn-1 + Fn-2 for n > 1

• 0, 1, 1, 2, 3, 5, 8, 13, …

Page 36: Dynamic Programming (continued)

Fibonacci Numbersint fibonacci(int n){

if(n == 0 || n == 1)return n;

elsereturn fibonacci(n-1) + fibonacci(n-

2);}

Page 37: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

Page 38: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

= active

Page 39: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

Page 40: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

Page 41: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

Page 42: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(1)

Page 43: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(1)

Page 44: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(0)F(1)

Page 45: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(0)F(1)

Page 46: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(0)F(1)

Page 47: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(1)F(2)

F(0)F(1)

Page 48: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(1)F(2)

F(0)F(1)

Page 49: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(1)F(2)

F(0)F(1)

Page 50: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Page 51: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(1)

Page 52: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(1)

Page 53: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(0)F(1)

Page 54: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(0)F(1)

Page 55: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(0)F(1)

Page 56: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(0)F(1)

Page 57: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(0)F(1)

Page 58: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

Page 59: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1) F(1)

Page 60: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1) F(1)

Page 61: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1) F(0)F(1)

Page 62: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1) F(0)F(1)

Page 63: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1) F(0)F(1)

Page 64: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Page 65: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Page 66: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Page 67: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Page 68: Dynamic Programming (continued)

Fibonacci Numbersw/ Memoization

int fibonacci(int n){

static map<int, int> memo;

if(memo.find(n) != memo.end())return memo[n];

if(n == 0 || n == 1)memo[n] = n;

elsememo[n] = fibonacci(n-1) + fibonacci(n-

2);

return memo[n];}

Memoization

Page 69: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Page 70: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Table Lookups

Page 71: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

F(2)

F(0)F(1)

F(1)

F(0)F(1)

Table Lookups

Page 72: Dynamic Programming (continued)

Fibonacci Numbers:F(5) w/ memoization

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookups

Page 73: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

Page 74: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

= active

Page 75: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

Page 76: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

Page 77: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

Page 78: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(1)

Page 79: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(1)

Page 80: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(0)F(1)

Page 81: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(0)F(1)

Page 82: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(2)

F(0)F(1)

Page 83: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(1)F(2)

F(0)F(1)

Page 84: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(1)F(2)

F(0)F(1)

Page 85: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(3)

F(1)F(2)

F(0)F(1)

Page 86: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Page 87: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookup

Page 88: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookup

Page 89: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookup

Page 90: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookup

Page 91: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookups

Page 92: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookups

Page 93: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

F(5)

F(3)F(4)

F(2)F(3)

F(1)F(2)

F(0)F(1)

Table Lookups

Page 94: Dynamic Programming (continued)

Fibonacci Numbers: Computing F(5)

• Memoization eliminated 6 out of 15 recursive calls

Page 95: Dynamic Programming (continued)

Dynamic Programming• Can be done in one of two ways

– iteration (bottom-up)– recursion w/ memoization (top-down)

Page 96: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

int fibonacci(int n){

int M[n + 1];

M[0] = 0;M[1] = 1;for(int i = 2; i <= n; ++i) {

M[i] = M[i-1] + M[i-2];}

return M[n];}

Page 97: Dynamic Programming (continued)

Fibonacci Numbersw/ Memoization

int fibonacci(int n){

static map<int, int> memo;

if(memo.find(n) != memo.end())return memo[n];

if(n == 0 || n == 1)memo[n] = n;

elsememo[n] = fibonacci(n-1) + fibonacci(n-

2);

return memo[n];}

Page 98: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

• What’s the runtime of the iterative algorithm?

Page 99: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

int fibonacci(int n){

int M[n + 1];

M[0] = 0;M[1] = 1;for(int i = 2; i <= n; ++i) {

M[i] = M[i-1] + M[i-2];}

return M[n];}

Page 100: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

int fibonacci(int n){

int M[n + 1];

M[0] = 0;M[1] = 1;for(int i = 2; i <= n; ++i) {

M[i] = M[i-1] + M[i-2];}

return M[n];}

Page 101: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

• What’s the runtime of this code?for(int i = 2; i <= n; ++i) {

M[i] = M[i-1] + M[i-2];}

Page 102: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

• What’s the runtime of this code?for(int i = 2; i <= n; ++i) {

M[i] = M[i-1] + M[i-2];}

• O(n)

Page 103: Dynamic Programming (continued)

Fibonacci Numbers: Iteration

int fibonacci(int n){

int M[n + 1];

M[0] = 0;M[1] = 1;for(int i = 2; i <= n; ++i) {

M[i] = M[i-1] + M[i-2];}

return M[n];}

Page 104: Dynamic Programming (continued)

Text Segmentation• Given a string without spaces,

what is the best segmentation of the string?

Page 105: Dynamic Programming (continued)

Text Segmentation• Some languages are written

without spaces between the words– difficult for search engines to

decipher the meaning of a search– difficult to return relevant results

Page 106: Dynamic Programming (continued)

Text Segmentation:Recursive Solution

• Recursion:

Pmax(y) = maxi P0(y[0:i]) x Pmax(y[i:n]);

Pmax(“”) = 1;

where n = length(y)

Page 107: Dynamic Programming (continued)

Text Segmentation:Recursive Solution

Pmax(“theyouthevent”) =

max(P0(“t”) x Pmax(“heyouthevent”),

P0(“th”) x Pmax(“eyouthevent”),

…P0(“theyouthevent”) x Pmax(“”)

);

Page 108: Dynamic Programming (continued)

Text Segmentation:Recursive Solution

double get_Pmax(const string &s){

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) *

get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

return max;}

Page 109: Dynamic Programming (continued)

Text Segmentation:Recursive Solution

P0(“”) x Pmax(“”)

double get_Pmax(const string &s){

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) *

get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

return max;}

Page 110: Dynamic Programming (continued)

Text Segmentation:Recursive Solution

max(…)

P0(“”) x Pmax(“”)

double get_Pmax(const string &s){

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) *

get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

return max;}

Page 111: Dynamic Programming (continued)

Text Segmentation:Recursive Solution

max(…)

P0(“”) x Pmax(“”)

double get_Pmax(const string &s){

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) *

get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

return max;}

base case

Page 112: Dynamic Programming (continued)

double get_Pmax(const string &s){

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) *

get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

return max;}

Text Segmentation:Recursive Solution

max(…)

P0(“”) x Pmax(“”)

base case

Pmax(y) = maxi P0(y[0:i]) x Pmax(y[i:n])

Page 113: Dynamic Programming (continued)

Text Segmentation:Memoization

double get_Pmax(const string &s){

static map<string, double> probabilities;

if(probabilities.find(s) != probabilities.end())return probabilities[s];

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) * get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

probabilities[s] = max;return max;

}

Memoization

Page 114: Dynamic Programming (continued)

Text Segmentation:Memoization

double get_Pmax(const string &s){

static map<string, double> probabilities;

if(probabilities.find(s) != probabilities.end())return probabilities[s];

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) * get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

probabilities[s] = max;return max;

}

Memoization

P0(“”) x Pmax(“”)

Page 115: Dynamic Programming (continued)

Text Segmentation:Memoization

double get_Pmax(const string &s){

static map<string, double> probabilities;

if(probabilities.find(s) != probabilities.end())return probabilities[s];

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) * get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

probabilities[s] = max;return max;

}

Memoization

max(…)

P0(“”) x Pmax(“”)

Page 116: Dynamic Programming (continued)

Text Segmentation:Memoization

double get_Pmax(const string &s){

static map<string, double> probabilities;

if(probabilities.find(s) != probabilities.end())return probabilities[s];

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) * get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

probabilities[s] = max;return max;

}

Memoization

max(…)

P0(“”) x Pmax(“”)

base case

Page 117: Dynamic Programming (continued)

Text Segmentation:Memoization

double get_Pmax(const string &s){

static map<string, double> probabilities;

if(probabilities.find(s) != probabilities.end())return probabilities[s];

if(s.length() == 0)return get_P0(s);

double max = 0.0;for(int i = 1; i <= s.length(); ++i) {

double temp =get_P0(s.substr(0, i - 0)) * get_Pmax(s.substr(i));

if(temp > max)max = temp;

}

probabilities[s] = max;return max;

}

Memoization

Pmax(y) = maxi P0(y[0:i]) x Pmax(y[i:n])

max(…)

P0(“”) x Pmax(“”)

base case

Page 118: Dynamic Programming (continued)

Text Segmentation:Iteration

double get_Pmax(const string &s){

double probabilities[s.length() + 1];

probabilities[0] = 1.0;for(int i = 1; i <= s.length(); ++i) {

double max = 0.0;for(int j = 0; j < i; ++j) {

double temp =probabilities[j] * get_P0(s.substr(j,

s.length()-j));

if(temp > max)max = temp;

}probabilities[i] = max;

}

return probabilities[s.length() – 1];}

Page 119: Dynamic Programming (continued)

Text Segmentation:Iteration

• What’s the runtime of the iterative version of the algorithm?

Page 120: Dynamic Programming (continued)

Text Segmentation:Iteration

double get_Pmax(const string &s){

double probabilities[s.length() + 1];

probabilities[0] = 1.0;for(int i = 1; i <= s.length(); ++i) {

double max = 0.0;for(int j = 0; j < i; ++j) {

double temp =probabilities[j] * get_P0(s.substr(j,

s.length()-j));

if(temp > max)max = temp;

}probabilities[i] = max;

}

return probabilities[s.length() – 1];}

Page 121: Dynamic Programming (continued)

Text Segmentation:Iteration

• What’s the runtime of this code?

for(int i = 1; i <= s.length(); ++i) {double max = 0.0;for(int j = 0; j < i; ++j) {

double temp =probabilities[j] * get_P0(s.substr(j, s.length()-

j));

if(temp > max)max = temp;

}probabilities[i] = max;

}

Page 122: Dynamic Programming (continued)

Text Segmentation:Iteration

• What’s the runtime of this code?• O(n2)

for(int i = 1; i <= s.length(); ++i) {double max = 0.0;for(int j = 0; j < i; ++j) {

double temp =probabilities[j] * get_P0(s.substr(j,

s.length()-j));

if(temp > max)max = temp;

}probabilities[i] = max;

}

Page 123: Dynamic Programming (continued)

ACM ICPC• ACM - “Association for Computing

Machinery”

• ICPC - “International Collegiate Programming Contest”

Page 124: Dynamic Programming (continued)

ACM ICPC Results:World Finals 2008

Page 125: Dynamic Programming (continued)

ACM ICPC Results:World Finals 2008

Page 126: Dynamic Programming (continued)

ACM ICPC Results:Regionals 2008 (SE

U.S.A.)

Page 127: Dynamic Programming (continued)

ACM ICPC Results:Regionals 2008 (SE

U.S.A.)

Page 128: Dynamic Programming (continued)

ACM ICPC• Held once every year since 1977

– ACM Regionals are in the Fall (semester)

– ACM World Finals in the Spring

Page 129: Dynamic Programming (continued)

ACM ICPC• About 73 teams at this past year’s

Southeast USA Regional Contest (2008; feeds the 2009 World Finals)

• 100 teams at 2008 World Finals

Page 130: Dynamic Programming (continued)

ACM ICPC• Format

– Teams of 1-3 students (undergrads and 1st year grads)

– 1 computer per team– 5 hours– 10 problems

Page 131: Dynamic Programming (continued)

ACM ICPC• Format (cont.)

– Regionals – printed materials allowed (up to 12"x12"x2" in size)

– Worlds – no printed materials allowed

Page 132: Dynamic Programming (continued)

ACM ICPC• Eligibility decision tree:

http://cm2prod.baylor.edu/ICPCWiki/attach/StaticResources/eligibilitydecisiontree.pdf