SRM471 Div2 Medium(500) EllysPlaylists

EllysPlaylists

動的計画法。長さkで最後の曲がiであるプレイリストの数をnum[k][i]とすると、
num[k][i] = num[k-1][j1] + num[k-1][j2] + ……。
ただし、j1, j2, ……はi番目の曲の先頭3文字と末尾3文字が一致する曲の番号。

#include <string>
#include <vector>

using namespace std;

class EllysPlaylists
{
public:
    int countPlaylists( vector <string> songs, int K );
};

int EllysPlaylists::countPlaylists( vector <string> songs, int K )
{
    int n = (int)songs.size();

    vector<vector<int> > num( K, vector<int>( n ) );

    for ( int i=0; i<n; i++ )
        num[0][i] = 1;

    for ( int k=1; k<K; k++ )
    for ( int i=0; i<n; i++ )
    {
        num[k][i] = 0;

        for ( int j=0; j<n; j++ )
            if ( songs[j].substr(songs[j].length()-3,3) == songs[i].substr(0,3) )
                num[k][i] = ( num[k][i] + num[k-1][j] ) % 1000000007;
    }

    int ans = 0;
    for ( int i=0; i<n; i++ )
        ans = ( ans + num[K-1][i] ) % 1000000007;

    return ans;
}